diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /public/vgui_controls | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'public/vgui_controls')
81 files changed, 11912 insertions, 0 deletions
diff --git a/public/vgui_controls/AnalogBar.h b/public/vgui_controls/AnalogBar.h new file mode 100644 index 0000000..d6d696e --- /dev/null +++ b/public/vgui_controls/AnalogBar.h @@ -0,0 +1,109 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef ANALOGBAR_H +#define ANALOGBAR_H + +#ifdef _WIN32 +#pragma once +#endif + +#include <vgui/VGUI.h> +#include <vgui_controls/Panel.h> + +namespace vgui +{ + +//----------------------------------------------------------------------------- +// Purpose: Status bar that visually displays discrete analogValue in the form +// of a segmented strip +//----------------------------------------------------------------------------- +class AnalogBar : public Panel +{ + DECLARE_CLASS_SIMPLE( AnalogBar, Panel ); + +public: + AnalogBar(Panel *parent, const char *panelName); + ~AnalogBar(); + + // 'analogValue' is in the range [0.0f, 1.0f] + MESSAGE_FUNC_FLOAT( SetAnalogValue, "SetAnalogValue", analogValue ); + float GetAnalogValue(); + virtual void SetSegmentInfo( int gap, int width ); + + // utility function for calculating a time remaining string + static bool ConstructTimeRemainingString(OUT_Z_BYTECAP(outputBufferSizeInBytes) wchar_t *output, int outputBufferSizeInBytes, float startTime, float currentTime, float currentAnalogValue, float lastAnalogValueUpdateTime, bool addRemainingSuffix); + + void SetBarInset( int pixels ); + int GetBarInset( void ); + + virtual void ApplySettings(KeyValues *inResourceData); + virtual void GetSettings(KeyValues *outResourceData); + virtual const char *GetDescription(); + + // returns the number of segment blocks drawn + int GetDrawnSegmentCount(); + int GetTotalSegmentCount(); + + enum AnalogValueDir_e + { + PROGRESS_EAST, + PROGRESS_WEST, + PROGRESS_NORTH, + PROGRESS_SOUTH + }; + + int GetAnalogValueDirection() const { return m_iAnalogValueDirection; } + void SetAnalogValueDirection( int val ) { m_iAnalogValueDirection = val; } + + void SetHomeValue( float val ) { m_fHomeValue = val; } + + const Color& GetHomeColor( void ) { return m_HomeColor; } + void SetHomeColor( const Color &color ) { m_HomeColor = color; } + +protected: + virtual void Paint(); + void PaintSegment( int &x, int &y, int tall, int wide, Color color, bool bHome ); + virtual void PaintBackground(); + virtual void ApplySchemeSettings(IScheme *pScheme); + MESSAGE_FUNC_PARAMS( OnDialogVariablesChanged, "DialogVariables", dialogVariables ); + /* CUSTOM MESSAGE HANDLING + "SetAnalogValue" + input: "analogValue" - float value of the analogValue to set + */ + +protected: + int m_iAnalogValueDirection; + float _analogValue; + +private: + int _segmentCount; + int _segmentGap; + int _segmentWide; + int m_iBarInset; + char *m_pszDialogVar; + + float m_fHomeValue; + Color m_HomeColor; +}; + +//----------------------------------------------------------------------------- +// Purpose: Non-segmented analogValue bar +//----------------------------------------------------------------------------- +class ContinuousAnalogBar : public AnalogBar +{ + DECLARE_CLASS_SIMPLE( ContinuousAnalogBar, AnalogBar ); + +public: + ContinuousAnalogBar(Panel *parent, const char *panelName); + + virtual void Paint(); +}; + +} // namespace vgui + +#endif // ANALOGBAR_H diff --git a/public/vgui_controls/AnimatingImagePanel.h b/public/vgui_controls/AnimatingImagePanel.h new file mode 100644 index 0000000..a65a5dc --- /dev/null +++ b/public/vgui_controls/AnimatingImagePanel.h @@ -0,0 +1,66 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef ANIMATINGIMAGEPANEL_H +#define ANIMATINGIMAGEPANEL_H + +#ifdef _WIN32 +#pragma once +#endif + +#include <utlvector.h> +#include <vgui_controls/Panel.h> + +namespace vgui +{ + +//----------------------------------------------------------------------------- +// Purpose: Animating image +//----------------------------------------------------------------------------- +class AnimatingImagePanel : public Panel +{ + DECLARE_CLASS_SIMPLE( AnimatingImagePanel, Panel ); + +public: + AnimatingImagePanel(Panel *parent, const char *name); + + // Add an image to the end of the list of animations + // image - pointer to the image to add to the end of the list + virtual void AddImage(IImage *image); + + // Load a set of animations by name. + // baseName - The name of the animations without their frame number or file extension, (e.g. c1.tga becomes just c.) + // framecount: number of frames in the animation + virtual void LoadAnimation(const char *baseName, int frameCount); + + virtual void StartAnimation(); + virtual void StopAnimation(); + virtual void ResetAnimation(int frame = 0); + +protected: + virtual void OnTick(); + virtual void PerformLayout(); + virtual void PaintBackground(); + + virtual void GetSettings(KeyValues *outResourceData); + virtual void ApplySettings(KeyValues *inResourceData); + virtual const char *GetDescription(); + +private: + int m_iCurrentImage; + int m_iNextFrameTime; + int m_iFrameTimeMillis; + CUtlVector<IImage *> m_Frames; + char *m_pImageName; + bool m_bAnimating; + bool m_bFiltered; + bool m_bScaleImage; +}; + +}; // namespace vgui + +#endif // ANIMATINGIMAGEPANEL_H diff --git a/public/vgui_controls/AnimationController.h b/public/vgui_controls/AnimationController.h new file mode 100644 index 0000000..63f29f4 --- /dev/null +++ b/public/vgui_controls/AnimationController.h @@ -0,0 +1,283 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//=============================================================================// + +#ifndef ANIMATIONCONTROLLER_H +#define ANIMATIONCONTROLLER_H +#ifdef _WIN32 +#pragma once +#endif + +#include <vgui_controls/Panel.h> +#include <vgui_controls/PHandle.h> + +#include "tier1/utlsymbol.h" +#include "tier1/utlvector.h" + +namespace vgui +{ + +//----------------------------------------------------------------------------- +// Purpose: Handles controlling panel animation +// It is never visible, but needs to be a panel so that can receive messages +//----------------------------------------------------------------------------- +class AnimationController : public Panel +{ + DECLARE_CLASS_SIMPLE( AnimationController, Panel ); + +public: + AnimationController(Panel *parent); + ~AnimationController(); + + // sets which script file to use + bool SetScriptFile( VPANEL sizingPanel, const char *fileName, bool wipeAll = false ); + + // reloads the currently set script file + void ReloadScriptFile(); + + // runs a frame of animation (time is passed in so slow motion, etc. works) + void UpdateAnimations( float curtime ); + + int GetNumActiveAnimations( void ) { return m_ActiveAnimations.Count(); } + + // plays all animations to completion instantly + void RunAllAnimationsToCompletion(); + + // stops all animations + void CancelAllAnimations(); + + // starts an animation sequence script + bool StartAnimationSequence(const char *sequenceName, bool bCanBeCancelled = true ); + bool StartAnimationSequence(Panel *pWithinParent, const char *sequenceName, bool bCanBeCancelled = true ); + + bool StopAnimationSequence( Panel *pWithinParent, const char *sequenceName ); + void CancelAnimationsForPanel( Panel *pWithinParent ); + + // gets the length of an animation sequence, in seconds + float GetAnimationSequenceLength(const char *sequenceName); + + // sets that the script file should be reloaded each time a script is ran + // used for development + void SetAutoReloadScript(bool state); + + enum Interpolators_e + { + INTERPOLATOR_LINEAR, + INTERPOLATOR_ACCEL, + INTERPOLATOR_DEACCEL, + INTERPOLATOR_PULSE, + INTERPOLATOR_FLICKER, + INTERPOLATOR_SIMPLESPLINE, // ease in / out + INTERPOLATOR_BOUNCE, // gravitational bounce + INTERPOLATOR_BIAS, + INTERPOLATOR_GAIN, + }; + + // runs the specific animation command (doesn't use script file at all) + void RunAnimationCommand(vgui::Panel *panel, const char *variable, float targetValue, float startDelaySeconds, float durationSeconds, Interpolators_e interpolator, float animParameter = 0 ); + void RunAnimationCommand(vgui::Panel *panel, const char *variable, Color targetValue, float startDelaySeconds, float durationSeconds, Interpolators_e interpolator, float animParameter = 0 ); + +private: + bool UpdateScreenSize(); + + bool LoadScriptFile(const char *fileName); + bool ParseScriptFile(char *pMem, int length); + + void UpdatePostedMessages(bool bRunToCompletion); + void UpdateActiveAnimations(bool bRunToCompletion); + + bool m_bAutoReloadScript; + float m_flCurrentTime; + + enum AnimCommandType_e + { + CMD_ANIMATE, + CMD_RUNEVENT, + CMD_STOPEVENT, + CMD_STOPANIMATION, + CMD_STOPPANELANIMATIONS, + CMD_SETFONT, + CMD_SETTEXTURE, + CMD_SETSTRING, + CMD_RUNEVENTCHILD, + CMD_FIRECOMMAND, + CMD_PLAYSOUND, + CMD_SETVISIBLE, + CMD_SETINPUTENABLED, + }; + + enum RelativeAlignment + { + a_northwest = 0, + a_north, + a_northeast, + a_west, + a_center, + a_east, + a_southwest, + a_south, + a_southeast, + }; + + struct RelativeAlignmentLookup + { + RelativeAlignment align; + char const *name; + }; + + // a single animatable value + // some var types use 1, 2, 3 or all 4 of the values + struct Value_t + { + float a, b, c, d; + }; + + struct AnimAlign_t + { + // For Position, Xpos, YPos + bool relativePosition; + UtlSymId_t alignPanel; + RelativeAlignment alignment; + }; + + // info for the animate command + struct AnimCmdAnimate_t + { + UtlSymId_t panel; + UtlSymId_t variable; + Value_t target; + int interpolationFunction; + float interpolationParameter; + float startTime; + float duration; + + AnimAlign_t align; + + }; + + // info for the run event command + struct AnimCmdEvent_t + { + UtlSymId_t event; + UtlSymId_t variable; + UtlSymId_t variable2; + float timeDelay; + }; + + // holds a single command from an animation sequence + struct AnimCommand_t + { + AnimCommandType_e commandType; + union + { + AnimCmdAnimate_t animate; + AnimCmdEvent_t runEvent; + } cmdData; + }; + + // holds a full sequence + struct AnimSequence_t + { + UtlSymId_t name; + float duration; + CUtlVector<AnimCommand_t> cmdList; + }; + + // holds the list of sequences + CUtlVector<AnimSequence_t> m_Sequences; + + // list of active animations + struct ActiveAnimation_t + { + PHandle panel; + UtlSymId_t seqName; // the sequence this belongs to + UtlSymId_t variable; + bool started; + Value_t startValue; + Value_t endValue; + int interpolator; + float interpolatorParam; + float startTime; + float endTime; + bool canBeCancelled; + + AnimAlign_t align; + }; + CUtlVector<ActiveAnimation_t> m_ActiveAnimations; + + // posted messages + struct PostedMessage_t + { + AnimCommandType_e commandType; + UtlSymId_t seqName; + UtlSymId_t event; + UtlSymId_t variable; + UtlSymId_t variable2; + float startTime; + PHandle parent; + bool canBeCancelled; + }; + CUtlVector<PostedMessage_t> m_PostedMessages; + + struct RanEvent_t + { + UtlSymId_t event; + Panel *pParent; + + bool operator==( const RanEvent_t &other ) const + { + return ( event == other.event && pParent == other.pParent ); + } + }; + + // variable names + UtlSymId_t m_sPosition, m_sSize, m_sFgColor, m_sBgColor; + UtlSymId_t m_sXPos, m_sYPos, m_sWide, m_sTall; + UtlSymId_t m_sModelPos; + + // file name + CUtlVector<UtlSymId_t> m_ScriptFileNames; + + // runs a single line of the script + void ExecAnimationCommand(UtlSymId_t seqName, AnimCommand_t &animCommand, Panel *pWithinParent, bool bCanBeCancelled); + // removes all commands belonging to a script + void RemoveQueuedAnimationCommands(UtlSymId_t seqName, vgui::Panel *panel = NULL); + // removes an existing instance of a command + void RemoveQueuedAnimationByType(vgui::Panel *panel, UtlSymId_t variable, UtlSymId_t sequenceToIgnore); + + // handlers + void StartCmd_Animate(UtlSymId_t seqName, AnimCmdAnimate_t &cmd, Panel *pWithinParent, bool bCanBeCancelled); + void StartCmd_Animate(Panel *panel, UtlSymId_t seqName, AnimCmdAnimate_t &cmd, bool bCanBeCancelled); + void RunCmd_RunEvent(PostedMessage_t &msg); + void RunCmd_StopEvent(PostedMessage_t &msg); + void RunCmd_StopPanelAnimations(PostedMessage_t &msg); + void RunCmd_StopAnimation(PostedMessage_t &msg); + void RunCmd_SetFont(PostedMessage_t &msg); + void RunCmd_SetTexture(PostedMessage_t &msg); + void RunCmd_SetString(PostedMessage_t &msg); + + // value access + Value_t GetValue(ActiveAnimation_t& anim, Panel *panel, UtlSymId_t var); + void SetValue(ActiveAnimation_t& anim, Panel *panel, UtlSymId_t var, Value_t &value); + + // interpolation + Value_t GetInterpolatedValue(int interpolator, float interpolatorParam, float currentTime, float startTime, float endTime, Value_t &startValue, Value_t &endValue); + + void SetupPosition( AnimCmdAnimate_t& cmd, float *output, char const *psz, int screendimension ); + static RelativeAlignment LookupAlignment( char const *token ); + static RelativeAlignmentLookup g_AlignmentLookup[]; + + int GetRelativeOffset( AnimAlign_t& cmd, bool xcoord ); + + VPANEL m_hSizePanel; + int m_nScreenBounds[ 4 ]; +}; + +// singleton accessor for use only by other vgui_controls +extern AnimationController *GetAnimationController(); + +} // namespace vgui + +#endif // ANIMATIONCONTROLLER_H diff --git a/public/vgui_controls/BitmapImagePanel.h b/public/vgui_controls/BitmapImagePanel.h new file mode 100644 index 0000000..639ffb6 --- /dev/null +++ b/public/vgui_controls/BitmapImagePanel.h @@ -0,0 +1,57 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef BITMAPIMAGEPANEL_H +#define BITMAPIMAGEPANEL_H +#ifdef _WIN32 +#pragma once +#endif + +#include <vgui_controls/Label.h> + +namespace vgui { + +class CBitmapImagePanel : public vgui::Panel +{ +public: + CBitmapImagePanel( vgui::Panel *parent, char const *panelName, char const *filename = NULL ); + ~CBitmapImagePanel(); + + virtual void PaintBackground(); + + virtual void setTexture( char const *filename, bool hardwareFiltered = true ); + + void setImageColor( Color color ) { m_bgColor = color; } + + // Set how the image aligns itself within the panel + virtual void SetContentAlignment(Label::Alignment alignment); + +protected: + virtual void GetSettings(KeyValues *outResourceData); + virtual void ApplySettings(KeyValues *inResourceData); + virtual const char *GetDescription(); + virtual void ApplySchemeSettings( IScheme *pScheme ); + virtual void PaintBorder(); + +private: + typedef vgui::Panel BaseClass; + + virtual void ComputeImagePosition(int &x, int &y, int &w, int &h); + Label::Alignment m_contentAlignment; + + bool m_preserveAspectRatio; + bool m_hardwareFiltered; + + IImage *m_pImage; + Color m_bgColor; + char *m_pszImageName; + char *m_pszColorName; +}; + +}; + +#endif // BITMAPIMAGEPANEL_H diff --git a/public/vgui_controls/BuildGroup.h b/public/vgui_controls/BuildGroup.h new file mode 100644 index 0000000..a0fcf35 --- /dev/null +++ b/public/vgui_controls/BuildGroup.h @@ -0,0 +1,190 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef VGUI_BUILDGROUP_H +#define VGUI_BUILDGROUP_H + +#ifdef _WIN32 +#pragma once +#endif + +#include "tier1/utlvector.h" +#include "tier1/utldict.h" +#include "tier1/utlsymbol.h" +#include <vgui/VGUI.h> +#include <vgui/Dar.h> +#include <vgui/Cursor.h> +#include <vgui/IScheme.h> +#include <vgui_controls/Controls.h> +#include <vgui_controls/PHandle.h> +#include "tier1/utlhandletable.h" + +class KeyValues; + +namespace vgui +{ + +//----------------------------------------------------------------------------- +// Purpose: a BuildGroup is a list of panels contained in a window (the contextPanel) +// Members of this group are viewable and editable in Build Mode, via the BuildModeDialog wizard +//----------------------------------------------------------------------------- +class BuildGroup +{ + DECLARE_HANDLES( BuildGroup, 20 ); + +public: + BuildGroup(Panel *parentPanel, Panel *contextPanel); + ~BuildGroup(); + + // Toggle build mode on/off + virtual void SetEnabled(bool state); + + // Check if buildgroup is enabled + virtual bool IsEnabled(); + + // Return the currently selected panel + virtual Panel *GetCurrentPanel(); + + // Load the control settings from file + virtual void LoadControlSettings(const char *controlResourceName, const char *pathID = NULL, KeyValues *pPreloadedKeyValues = NULL, KeyValues *pConditions = NULL ); + + // Reload the control settings from file + void ReloadControlSettings(); + + // changes which control settings are currently loaded + void ChangeControlSettingsFile(const char *controlResourceName); + + // Save control settings from file, using the same resource + // name as what LoadControlSettings() was called with + virtual bool SaveControlSettings(); + + // Serialize settings from a resource data container + virtual void ApplySettings(KeyValues *resourceData); + + // Serialize settings to a resource data container + virtual void GetSettings(KeyValues *resourceData); + + // Remove all objects in the current control group + virtual void RemoveSettings(); + + // Get a new unique fieldname for a new control + void GetNewFieldName(char *newFieldName, int newFieldNameSize, Panel *newPanel); + + // Check if a control name is already taken + Panel *FieldNameTaken(const char *fieldName); + + // Add a new control (via the BuildModeDialog) + Panel *NewControl( KeyValues *controlKeys, int x=0, int y=0); + Panel *NewControl( const char *name, int x=0, int y=0); + + // Set the panel from which the build group gets all it's object creation information + virtual void SetContextPanel(Panel *contextPanel); + + //Get the panel that build group is pointed at. + virtual Panel *GetContextPanel(); + + // Get the list of panels in the buildgroup + CUtlVector<PHandle> *GetPanelList(); + + // Get the resource file name used + virtual const char *GetResourceName(void) { return m_pResourceName; } + + virtual void PanelAdded(Panel* panel); + + virtual bool MousePressed(MouseCode code,Panel* panel); + virtual bool MouseReleased(MouseCode code,Panel* panel); + + // Get the list of panels that are currently selected + virtual CUtlVector<PHandle> *GetControlGroup(); + + // Toggle ruler display on/off + virtual void ToggleRulerDisplay(); + + // Toggle visibility of ruler number labels + virtual void SetRulerLabelsVisible(bool state); + + // Check if ruler display is activated + virtual bool HasRulersOn(); + + // Draw Rulers on screen + virtual void DrawRulers(); + + // registers that a control settings file may be loaded + // use when the dialog may have multiple states and the editor will need to be able to switch between them + void RegisterControlSettingsFile(const char *controlResourceName, const char *pathID = NULL); + + // iterator for registered files + int GetRegisteredControlSettingsFileCount(); + const char *GetRegisteredControlSettingsFileByIndex(int index); + + // dialog variables + KeyValues *GetDialogVariables(); + + // conditional keys for selectively reading keyvalues + void ProcessConditionalKeys( KeyValues *pDat, KeyValues *pConditions ); + + static bool PrecacheResFile( const char* pszResFileName ); + static void ClearResFileCache(); + +protected: + virtual bool CursorMoved(int x, int y, Panel *panel); + virtual bool MouseDoublePressed(MouseCode code, Panel *panel); + virtual bool KeyCodeTyped(KeyCode code, Panel *panel); + virtual bool KeyCodeReleased(KeyCode code, Panel *panel ); + virtual void ApplySchemeSettings(IScheme *pScheme); + virtual bool KeyTyped( wchar_t unichar, Panel *panel ); + + virtual HCursor GetCursor(Panel *panel); + +private: + void ApplySnap(Panel* panel); + Panel *CreateBuildDialog(); + void ActivateBuildDialog(); + void DeleteAllControlsCreatedByControlSettingsFile(); + + bool _enabled; + int _snapX; + int _snapY; + HCursor _cursor_sizenwse; + HCursor _cursor_sizenesw; + HCursor _cursor_sizewe; + HCursor _cursor_sizens; + HCursor _cursor_sizeall; + bool _dragging; + MouseCode _dragMouseCode; + int _dragStartPanelPos[2]; + int _dragStartCursorPos[2]; + int _dragStartPanelSize[ 2 ]; + Panel * _currentPanel; + CUtlVector<PHandle> _panelDar; + char *m_pResourceName; + char *m_pResourcePathID; + PHandle m_hBuildDialog; + Panel *m_pBuildContext; // the panel from which the build dialog gets all the information it needs + Panel *m_pParentPanel; // panel to create new controls in + CUtlVector<PHandle> _controlGroup; // grouped panels + CUtlVector<int> _groupDeltaX; // x offsets of panels in group from the selected panel + CUtlVector<int> _groupDeltaY; // y offsets of panels in group from the selected panel + Label *_rulerNumber[4]; // 4 numbers to label rulers with + bool _showRulers; // toggles ruler display + CUtlVector<CUtlSymbol> m_RegisteredControlSettingsFiles; + + friend class Panel; + + static CUtlDict< KeyValues* > m_dictCachedResFiles; +}; + + +//----------------------------------------------------------------------------- +// Handle to a build group +//----------------------------------------------------------------------------- +typedef CUtlHandle<BuildGroup> HBuildGroup; + + +} // namespace vgui + +#endif // VGUI_BUILDGROUP_H diff --git a/public/vgui_controls/BuildModeDialog.h b/public/vgui_controls/BuildModeDialog.h new file mode 100644 index 0000000..25c6185 --- /dev/null +++ b/public/vgui_controls/BuildModeDialog.h @@ -0,0 +1,136 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef BUILDMODEDIALOG_H +#define BUILDMODEDIALOG_H + +#ifdef _WIN32 +#pragma once +#endif + +#include <vgui_controls/Frame.h> + +struct PanelItem_t; + +namespace vgui +{ + +//----------------------------------------------------------------------------- +// Purpose: Dialog for use in build mode editing +//----------------------------------------------------------------------------- +class BuildModeDialog : public Frame +{ + DECLARE_CLASS_SIMPLE( BuildModeDialog, Frame ); + +public: + BuildModeDialog( BuildGroup *buildGroup ); + ~BuildModeDialog(); + + // Set the current control to edit + MESSAGE_FUNC_PTR( SetActiveControl, "SetActiveControl", panelPtr ); + + // Update the current control with the current resource settings. + MESSAGE_FUNC_PTR( UpdateControlData, "UpdateControlData", panel ); + + // Store the current settings of all panels in the build group. + virtual KeyValues *StoreSettings(); + + // Store the current settings of the current panel + MESSAGE_FUNC( StoreUndoSettings, "StoreUndo" ); + + /* CUSTOM MESSAGE HANDLING + "SetActiveControl" + input: "PanelPtr" - panel to set active control to edit to + */ + + MESSAGE_FUNC( OnShowNewControlMenu, "ShowNewControlMenu" ); + +protected: + virtual void PerformLayout(); + virtual void OnClose(); + virtual void OnCommand( const char *command ); + virtual void ApplySchemeSettings( vgui::IScheme *pScheme ); + virtual bool IsBuildGroupEnabled(); + +private: + void CreateControls(); + + void OnKeyCodeTyped(KeyCode code); + MESSAGE_FUNC( ApplyDataToControls, "ApplyDataToControls" ); + MESSAGE_FUNC_PTR( OnTextChanged, "TextChanged", panel ); + MESSAGE_FUNC( OnDeletePanel, "DeletePanel" ); + void ExitBuildMode(); + Panel *OnNewControl(const char *name, int x = 0, int y = 0); + MESSAGE_FUNC( DoUndo, "Undo" ); + MESSAGE_FUNC( DoCopy, "Copy" ); + MESSAGE_FUNC( DoPaste, "Paste" ); + MESSAGE_FUNC( EnableSaveButton, "EnableSaveButton" ); + void RevertToSaved(); + void ShowHelp(); + MESSAGE_FUNC( ShutdownBuildMode, "Close" ); + MESSAGE_FUNC( OnPanelMoved, "PanelMoved" ); + MESSAGE_FUNC( OnTextKillFocus, "TextKillFocus" ); + MESSAGE_FUNC( OnReloadLocalization, "ReloadLocalization" ); + MESSAGE_FUNC_CHARPTR( OnCreateNewControl, "CreateNewControl", text ); + + MESSAGE_FUNC_CHARPTR( OnSetClipboardText, "SetClipboardText", text ); + + MESSAGE_FUNC_INT( OnChangeChild, "OnChangeChild", direction ); + + Panel *m_pCurrentPanel; + BuildGroup *m_pBuildGroup; + Label *m_pStatusLabel; + ComboBox *m_pFileSelectionCombo; + Divider *m_pDivider; + + class PanelList; + PanelList *m_pPanelList; + + Button *m_pSaveButton; + Button *m_pApplyButton; + Button *m_pExitButton; + Button *m_pDeleteButton; + Button *m_pReloadLocalization; + MenuButton *m_pVarsButton; + + bool _autoUpdate; + + ComboBox *m_pAddNewControlCombo; // combo box for adding new controls + KeyValues *_undoSettings; // settings for the Undo command + KeyValues *_copySettings; // settings for the Copy/Paste command + char _copyClassName[255]; + int m_nClick[ 2 ]; + + void RemoveAllControls( void ); + void UpdateEditControl(PanelItem_t &panelItem, const char *datstring); + + enum { + TYPE_STRING, + TYPE_INTEGER, + TYPE_COLOR, + TYPE_ALIGNMENT, + TYPE_AUTORESIZE, + TYPE_CORNER, + TYPE_LOCALIZEDSTRING, + }; + + vgui::DHANDLE< Menu > m_hContextMenu; + + ComboBox *m_pEditableParents; + ComboBox *m_pEditableChildren; + + Button *m_pNextChild; + Button *m_pPrevChild; + + friend class PanelList; +}; + +} // namespace vgui + + +#endif // BUILDMODEDIALOG_H + diff --git a/public/vgui_controls/Button.h b/public/vgui_controls/Button.h new file mode 100644 index 0000000..613d242 --- /dev/null +++ b/public/vgui_controls/Button.h @@ -0,0 +1,239 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//===========================================================================// + +#ifndef BUTTON_H +#define BUTTON_H + +#ifdef _WIN32 +#pragma once +#endif + +#include <vgui/VGUI.h> +#include <vgui/Dar.h> +#include <Color.h> +#include <vgui_controls/Label.h> +#include "vgui/MouseCode.h" + +namespace vgui +{ + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +class Button : public Label +{ + DECLARE_CLASS_SIMPLE( Button, Label ); + +public: + // You can optionally pass in the panel to send the click message to and the name of the command to send to that panel. + Button(Panel *parent, const char *panelName, const char *text, Panel *pActionSignalTarget=NULL, const char *pCmd=NULL); + Button(Panel *parent, const char *panelName, const wchar_t *text, Panel *pActionSignalTarget=NULL, const char *pCmd=NULL); + ~Button(); +private: + void Init(); +public: + // Set armed state. + virtual void SetArmed(bool state); + // Check armed state + virtual bool IsArmed( void ); + + // Check depressed state + virtual bool IsDepressed(); + // Set button force depressed state. + virtual void ForceDepressed(bool state); + // Set button depressed state with respect to the force depressed state. + virtual void RecalculateDepressedState( void ); + + // Set button selected state. + virtual void SetSelected(bool state); + // Check selected state + virtual bool IsSelected( void ); + + virtual void SetBlink(bool state); + virtual bool IsBlinking( void ); + + //Set whether or not the button captures all mouse input when depressed. + virtual void SetUseCaptureMouse( bool state ); + // Check if mouse capture is enabled. + virtual bool IsUseCaptureMouseEnabled( void ); + + // Activate a button click. + MESSAGE_FUNC( DoClick, "PressButton" ); + MESSAGE_FUNC( OnHotkey, "Hotkey" ) + { + DoClick(); + } + + // Set button to be mouse clickable or not. + virtual void SetMouseClickEnabled( MouseCode code, bool state ); + // Check if button is mouse clickable + virtual bool IsMouseClickEnabled( MouseCode code ); + // sets the how this button activates + enum ActivationType_t + { + ACTIVATE_ONPRESSEDANDRELEASED, // normal button behaviour + ACTIVATE_ONPRESSED, // menu buttons, toggle buttons + ACTIVATE_ONRELEASED, // menu items + }; + virtual void SetButtonActivationType(ActivationType_t activationType); + + // Message targets that the button has been pressed + virtual void FireActionSignal( void ); + // Perform graphical layout of button + virtual void PerformLayout(); + + virtual bool RequestInfo(KeyValues *data); + + virtual bool CanBeDefaultButton(void); + + // Set this button to be the button that is accessed by default when the user hits ENTER or SPACE + MESSAGE_FUNC_INT( SetAsDefaultButton, "SetAsDefaultButton", state ); + // Set this button to be the button that is currently accessed by default when the user hits ENTER or SPACE + MESSAGE_FUNC_INT( SetAsCurrentDefaultButton, "SetAsCurrentDefaultButton", state ); + + // Respond when key focus is received + virtual void OnSetFocus(); + // Respond when focus is killed + virtual void OnKillFocus(); + + // Set button border attribute enabled, controls display of button. + virtual void SetButtonBorderEnabled( bool state ); + + // Set default button colors. + virtual void SetDefaultColor(Color fgColor, Color bgColor); + // Set armed button colors + virtual void SetArmedColor(Color fgColor, Color bgColor); + // Set selected button colors + virtual void SetSelectedColor(Color fgColor, Color bgColor); + // Set depressed button colors + virtual void SetDepressedColor(Color fgColor, Color bgColor); + // Set blink button color + virtual void SetBlinkColor(Color fgColor); + + // Get button foreground color + virtual Color GetButtonFgColor(); + // Get button background color + virtual Color GetButtonBgColor(); + + Color GetButtonDefaultFgColor() { return _defaultFgColor; } + Color GetButtonDefaultBgColor() { return _defaultBgColor; } + + Color GetButtonArmedFgColor() { return _armedFgColor; } + Color GetButtonArmedBgColor() { return _armedBgColor; } + + Color GetButtonSelectedFgColor() { return _selectedFgColor; } + Color GetButtonSelectedBgColor() { return _selectedBgColor; } + + Color GetButtonDepressedFgColor() { return _depressedFgColor; } + Color GetButtonDepressedBgColor() { return _depressedBgColor; } + + // Set default button border attributes. + virtual void SetDefaultBorder(IBorder *border); + // Set depressed button border attributes. + virtual void SetDepressedBorder(IBorder *border); + // Set key focused button border attributes. + virtual void SetKeyFocusBorder(IBorder *border); + + // Set the command to send when the button is pressed + // Set the panel to send the command to with AddActionSignalTarget() + virtual void SetCommand( const char *command ); + // Set the message to send when the button is pressed + virtual void SetCommand( KeyValues *message ); + + // sound handling + void SetArmedSound(const char *sound); + void SetDepressedSound(const char *sound); + void SetReleasedSound(const char *sound); + + /* CUSTOM MESSAGE HANDLING + "PressButton" - makes the button act as if it had just been pressed by the user (just like DoClick()) + input: none + */ + + virtual void OnCursorEntered(); + virtual void OnCursorExited(); + virtual void SizeToContents(); + + virtual KeyValues *GetCommand(); + + bool IsDrawingFocusBox(); + void DrawFocusBox( bool bEnable ); + + bool ShouldPaint(){ return _paint; } + void SetShouldPaint( bool paint ){ _paint = paint; } + + virtual void ApplySettings( KeyValues *inResourceData ); + virtual void NavigateTo(); + virtual void NavigateFrom(); + +protected: + virtual void DrawFocusBorder(int tx0, int ty0, int tx1, int ty1); + + // Paint button on screen + virtual void Paint(void); + // Get button border attributes. + virtual IBorder *GetBorder(bool depressed, bool armed, bool selected, bool keyfocus); + + virtual void ApplySchemeSettings(IScheme *pScheme); + MESSAGE_FUNC_INT( OnSetState, "SetState", state ); + + virtual void OnMousePressed(MouseCode code); + virtual void OnMouseDoublePressed(MouseCode code); + virtual void OnMouseReleased(MouseCode code); + virtual void OnKeyCodePressed(KeyCode code); + virtual void OnKeyCodeReleased(KeyCode code); + + // Get control settings for editing + virtual void GetSettings( KeyValues *outResourceData ); + virtual const char *GetDescription( void ); + + KeyValues *GetActionMessage(); + void PlayButtonReleasedSound(); + +protected: + enum ButtonFlags_t + { + ARMED = 0x0001, + DEPRESSED = 0x0002, + FORCE_DEPRESSED = 0x0004, + BUTTON_BORDER_ENABLED = 0x0008, + USE_CAPTURE_MOUSE = 0x0010, + BUTTON_KEY_DOWN = 0x0020, + DEFAULT_BUTTON = 0x0040, + SELECTED = 0x0080, + DRAW_FOCUS_BOX = 0x0100, + BLINK = 0x0200, + ALL_FLAGS = 0xFFFF, + }; + + CUtlFlags< unsigned short > _buttonFlags; // see ButtonFlags_t + int _mouseClickMask; + KeyValues *_actionMessage; + ActivationType_t _activationType; + + IBorder *_defaultBorder; + IBorder *_depressedBorder; + IBorder *_keyFocusBorder; + + Color _defaultFgColor, _defaultBgColor; + Color _armedFgColor, _armedBgColor; + Color _selectedFgColor, _selectedBgColor; + Color _depressedFgColor, _depressedBgColor; + Color _keyboardFocusColor; + Color _blinkFgColor; + + bool _paint; + + unsigned short m_sArmedSoundName, m_sDepressedSoundName, m_sReleasedSoundName; + bool m_bSelectionStateSaved; + bool m_bStaySelectedOnClick; + bool m_bStayArmedOnClick; +}; + +} // namespace vgui + +#endif // BUTTON_H diff --git a/public/vgui_controls/CheckButton.h b/public/vgui_controls/CheckButton.h new file mode 100644 index 0000000..d0b3f34 --- /dev/null +++ b/public/vgui_controls/CheckButton.h @@ -0,0 +1,108 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef CHECKBUTTON_H +#define CHECKBUTTON_H + +#ifdef _WIN32 +#pragma once +#endif + +#include <vgui/VGUI.h> +#include <vgui_controls/ToggleButton.h> +#include <vgui_controls/TextImage.h> + +namespace vgui +{ + +class TextImage; + +//----------------------------------------------------------------------------- +// Purpose: Check box image +//----------------------------------------------------------------------------- +class CheckImage : public TextImage +{ +public: + CheckImage(CheckButton *CheckButton) : TextImage( "g" ) + { + _CheckButton = CheckButton; + + SetSize(20, 13); + } + + virtual void Paint(); + + virtual void SetColor(Color color) + { + _borderColor1 = color; + _borderColor2 = color; + _checkColor = color; + } + + Color _borderColor1; + Color _borderColor2; + Color _checkColor; + + Color _bgColor; + +private: + CheckButton *_CheckButton; +}; + +//----------------------------------------------------------------------------- +// Purpose: Tick-box button +//----------------------------------------------------------------------------- +class CheckButton : public ToggleButton +{ + DECLARE_CLASS_SIMPLE( CheckButton, ToggleButton ); + +public: + CheckButton(Panel *parent, const char *panelName, const char *text); + ~CheckButton(); + + // Check the button + virtual void SetSelected(bool state ); + + // sets whether or not the state of the check can be changed + // if this is set to false, then no input in the code or by the user can change it's state + virtual void SetCheckButtonCheckable(bool state); + virtual bool IsCheckButtonCheckable() const { return m_bCheckButtonCheckable; } + + Color GetDisabledFgColor() { return _disabledFgColor; } + Color GetDisabledBgColor() { return _disabledBgColor; } + + CheckImage *GetCheckImage() { return _checkBoxImage; } + + virtual void SetHighlightColor(Color fgColor); + virtual void ApplySettings( KeyValues *inResourceData ) OVERRIDE; + +protected: + virtual void ApplySchemeSettings(IScheme *pScheme); + MESSAGE_FUNC_PTR( OnCheckButtonChecked, "CheckButtonChecked", panel ); + virtual Color GetButtonFgColor(); + + virtual IBorder *GetBorder(bool depressed, bool armed, bool selected, bool keyfocus); + + /* MESSAGES SENT + "CheckButtonChecked" - sent when the check button state is changed + "state" - button state: 1 is checked, 0 is unchecked + */ + + +private: + enum { CHECK_INSET = 6 }; + bool m_bCheckButtonCheckable; + bool m_bUseSmallCheckImage; + CheckImage *_checkBoxImage; + Color _disabledFgColor; + Color _disabledBgColor; + Color _highlightFgColor; +}; + +} // namespace vgui + +#endif // CHECKBUTTON_H diff --git a/public/vgui_controls/CheckButtonList.h b/public/vgui_controls/CheckButtonList.h new file mode 100644 index 0000000..6bb95d9 --- /dev/null +++ b/public/vgui_controls/CheckButtonList.h @@ -0,0 +1,74 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//=============================================================================// + +#ifndef CHECKBUTTONLIST_H +#define CHECKBUTTONLIST_H +#ifdef _WIN32 +#pragma once +#endif + +#include <vgui_controls/EditablePanel.h> +#include "utlvector.h" + +namespace vgui +{ + +//----------------------------------------------------------------------------- +// Purpose: Contains a list of check boxes, displaying scrollbars if necessary +//----------------------------------------------------------------------------- +class CheckButtonList : public EditablePanel +{ + DECLARE_CLASS_SIMPLE( CheckButtonList, EditablePanel ); + +public: + CheckButtonList(Panel *parent, const char *name); + ~CheckButtonList(); + + // adds a check button to the list + int AddItem(const char *itemText, bool startsSelected, KeyValues *userData); + + // clears the list + void RemoveAll(); + + // number of items in list that are checked + int GetCheckedItemCount(); + + // item iteration + bool IsItemIDValid(int itemID); + int GetHighestItemID(); + int GetItemCount(); + + // item info + KeyValues *GetItemData(int itemID); + bool IsItemChecked(int itemID); + void SetItemCheckable(int itemID, bool state); + + /* MESSAGES SENT + "CheckButtonChecked" - sent when one of the check buttons state has changed + + */ + +protected: + virtual void PerformLayout(); + virtual void ApplySchemeSettings(IScheme *pScheme); + virtual void OnMouseWheeled(int delta); + +private: + MESSAGE_FUNC_PARAMS( OnCheckButtonChecked, "CheckButtonChecked", pParams ); + MESSAGE_FUNC( OnScrollBarSliderMoved, "ScrollBarSliderMoved" ); + + struct CheckItem_t + { + vgui::CheckButton *checkButton; + KeyValues *userData; + }; + CUtlVector<CheckItem_t> m_CheckItems; + vgui::ScrollBar *m_pScrollBar; +}; + +} + +#endif // CHECKBUTTONLIST_H diff --git a/public/vgui_controls/CircularProgressBar.h b/public/vgui_controls/CircularProgressBar.h new file mode 100644 index 0000000..4f69fd8 --- /dev/null +++ b/public/vgui_controls/CircularProgressBar.h @@ -0,0 +1,76 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef CIRCULARPROGRESSBAR_H +#define CIRCULARPROGRESSBAR_H + +#ifdef _WIN32 +#pragma once +#endif + +#include <vgui/VGUI.h> +#include <vgui_controls/Panel.h> +#include <vgui_controls/ProgressBar.h> + +enum progress_textures_t +{ + PROGRESS_TEXTURE_FG, + PROGRESS_TEXTURE_BG, + + NUM_PROGRESS_TEXTURES, +}; + +namespace vgui +{ + +//----------------------------------------------------------------------------- +// Purpose: Progress Bar in the shape of a pie graph +//----------------------------------------------------------------------------- +class CircularProgressBar : public ProgressBar +{ + DECLARE_CLASS_SIMPLE( CircularProgressBar, ProgressBar ); + +public: + CircularProgressBar(Panel *parent, const char *panelName); + ~CircularProgressBar(); + + virtual void ApplySettings(KeyValues *inResourceData); + virtual void ApplySchemeSettings(IScheme *pScheme); + + void SetFgImage(const char *imageName) { SetImage( imageName, PROGRESS_TEXTURE_FG ); } + void SetBgImage(const char *imageName) { SetImage( imageName, PROGRESS_TEXTURE_BG ); } + + enum CircularProgressDir_e + { + PROGRESS_CW, + PROGRESS_CCW + }; + int GetProgressDirection() const { return m_iProgressDirection; } + void SetProgressDirection( int val ) { m_iProgressDirection = val; } + void SetStartSegment( int val ) { m_iStartSegment = val; } + void SetReverseProgress( bool bReverse ) { m_bReverseProgress = bReverse; } + +protected: + virtual void Paint(); + virtual void PaintBackground(); + + void DrawCircleSegment( Color c, float flEndDegrees, bool clockwise /* = true */ ); + void SetImage(const char *imageName, progress_textures_t iPos); + +private: + int m_iProgressDirection; + int m_iStartSegment; + bool m_bReverseProgress; + + int m_nTextureId[NUM_PROGRESS_TEXTURES]; + char *m_pszImageName[NUM_PROGRESS_TEXTURES]; + int m_lenImageName[NUM_PROGRESS_TEXTURES]; +}; + +} // namespace vgui + +#endif // CIRCULARPROGRESSBAR_H
\ No newline at end of file diff --git a/public/vgui_controls/ComboBox.h b/public/vgui_controls/ComboBox.h new file mode 100644 index 0000000..266f4dc --- /dev/null +++ b/public/vgui_controls/ComboBox.h @@ -0,0 +1,186 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef COMBOBOX_H +#define COMBOBOX_H + +#ifdef _WIN32 +#pragma once +#endif + +#include <vgui_controls/TextEntry.h> +#include <vgui_controls/Menu.h> +#include <vgui_controls/Button.h> + +namespace vgui +{ +//----------------------------------------------------------------------------- +// Purpose: Scroll bar button +//----------------------------------------------------------------------------- +class ComboBoxButton : public vgui::Button +{ +public: + ComboBoxButton(ComboBox *parent, const char *panelName, const char *text); + virtual void ApplySchemeSettings(IScheme *pScheme); + virtual IBorder *GetBorder(bool depressed, bool armed, bool selected, bool keyfocus); + virtual void OnCursorExited(); + + virtual Color GetButtonBgColor() + { + if (IsEnabled()) + return Button::GetButtonBgColor(); + + return m_DisabledBgColor; + } + +private: + Color m_DisabledBgColor; +}; + +//----------------------------------------------------------------------------- +// Purpose: Text entry with drop down options list +//----------------------------------------------------------------------------- +class ComboBox : public TextEntry +{ + DECLARE_CLASS_SIMPLE( ComboBox, TextEntry ); + +public: + ComboBox(Panel *parent, const char *panelName, int numLines, bool allowEdit); + ~ComboBox(); + + // functions designed to be overriden + virtual void OnShowMenu(Menu *menu) {} + virtual void OnHideMenu(Menu *menu) {} + + // Set the number of items in the drop down menu. + virtual void SetNumberOfEditLines( int numLines ); + + // Add an item to the drop down + virtual int AddItem(const char *itemText, const KeyValues *userData); + virtual int AddItem(const wchar_t *itemText, const KeyValues *userData); + + virtual int GetItemCount() const; + int GetItemIDFromRow( int row ); + + // update the item + virtual bool UpdateItem(int itemID, const char *itemText,const KeyValues *userData); + virtual bool UpdateItem(int itemID, const wchar_t *itemText, const KeyValues *userData); + virtual bool IsItemIDValid(int itemID); + + // set the enabled state of an item + virtual void SetItemEnabled(const char *itemText, bool state); + virtual void SetItemEnabled(int itemID, bool state); + + // Removes a single item + void DeleteItem( int itemID ); + + // Remove all items from the drop down menu + void RemoveAll(); + // deprecated, use above + void DeleteAllItems() { RemoveAll(); } + + // Sorts the items in the list - FIXME does nothing + virtual void SortItems(); + + // Set the visiblity of the drop down menu button. + virtual void SetDropdownButtonVisible(bool state); + + // Return true if the combobox current has the dropdown menu open + virtual bool IsDropdownVisible(); + + // Activate the item in the menu list,as if that + // menu item had been selected by the user + MESSAGE_FUNC_INT( ActivateItem, "ActivateItem", itemID ); + void ActivateItemByRow(int row); + + void SilentActivateItem(int itemID); // Sets the menu to the appropriate row without sending a TextChanged message + void SilentActivateItemByRow(int row); // Sets the menu to the appropriate row without sending a TextChanged message + + int GetActiveItem(); + KeyValues *GetActiveItemUserData(); + KeyValues *GetItemUserData(int itemID); + void GetItemText( int itemID, OUT_Z_BYTECAP(bufLenInBytes) wchar_t *text, int bufLenInBytes ); + void GetItemText( int itemID, OUT_Z_BYTECAP(bufLenInBytes) char *text, int bufLenInBytes ); + + // sets a custom menu to use for the dropdown + virtual void SetMenu( Menu *menu ); + virtual Menu *GetMenu() { return m_pDropDown; } + + // Layout the format of the combo box for drawing on screen + virtual void PerformLayout(); + + /* action signals + "TextChanged" - signals that the text has changed in the combo box + + */ + + virtual void ShowMenu(); + virtual void HideMenu(); + virtual void OnKillFocus(); + MESSAGE_FUNC( OnMenuClose, "MenuClose" ); + virtual void DoClick(); + virtual void OnSizeChanged(int wide, int tall); + + virtual void SetOpenDirection(Menu::MenuDirection_e direction); + + virtual void SetFont( HFont font ); + + virtual void SetUseFallbackFont( bool bState, HFont hFallback ); + + ComboBoxButton *GetComboButton( void ) { return m_pButton; } + +protected: + // overrides + virtual void OnMousePressed(MouseCode code); + virtual void OnMouseDoublePressed(MouseCode code); + MESSAGE_FUNC( OnMenuItemSelected, "MenuItemSelected" ); + virtual void OnCommand( const char *command ); + virtual void ApplySchemeSettings(IScheme *pScheme); + virtual void ApplySettings( KeyValues *pInResourceData ); + virtual void OnCursorEntered(); + virtual void OnCursorExited(); + + // custom message handlers + MESSAGE_FUNC_WCHARPTR( OnSetText, "SetText", text ); + virtual void OnSetFocus(); // called after the panel receives the keyboard focus +#ifdef _X360 + virtual void OnKeyCodePressed(KeyCode code); +#endif + virtual void OnKeyCodeTyped(KeyCode code); + virtual void OnKeyTyped(wchar_t unichar); + + void SelectMenuItem(int itemToSelect); + void MoveAlongMenuItemList(int direction); + void MoveToFirstMenuItem(); + void MoveToLastMenuItem(); +private: + void DoMenuLayout(); + + Menu *m_pDropDown; + ComboBoxButton *m_pButton; + bool m_bPreventTextChangeMessage; + +//============================================================================= +// HPE_BEGIN: +// [pfreese] This member variable is never initialized and not used correctly +//============================================================================= + +// bool m_bAllowEdit; + +//============================================================================= +// HPE_END +//============================================================================= + bool m_bHighlight; + Menu::MenuDirection_e m_iDirection; + int m_iOpenOffsetY; + + char m_szBorderOverride[64]; +}; + +} // namespace vgui + +#endif // COMBOBOX_H diff --git a/public/vgui_controls/ControllerMap.h b/public/vgui_controls/ControllerMap.h new file mode 100644 index 0000000..7ccbdc6 --- /dev/null +++ b/public/vgui_controls/ControllerMap.h @@ -0,0 +1,48 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef CONTROLLERMAP_H +#define CONTROLLERMAP_H +#ifdef _WIN32 +#pragma once +#endif + +#include "Panel.h" +#include "utlmap.h" +#include "utlsymbol.h" + +class CControllerMap : public vgui::Panel +{ + DECLARE_CLASS_SIMPLE( CControllerMap, vgui::Panel ) + + virtual void OnKeyCodeTyped( vgui::KeyCode code ); + +public: + CControllerMap( vgui::Panel *parent, const char *name ); + + virtual void ApplySettings( KeyValues *inResourceData ); + + int NumButtons( void ) + { + return m_buttonMap.Count(); + } + + const char *GetBindingText( int idx ); + const char *GetBindingIcon( int idx ); + +private: + + struct button_t + { + CUtlSymbol cmd; + CUtlSymbol text; + CUtlSymbol icon; + }; + CUtlMap< int, button_t > m_buttonMap; +}; + +#endif // CONTROLLERMAP_H
\ No newline at end of file diff --git a/public/vgui_controls/Controls.h b/public/vgui_controls/Controls.h new file mode 100644 index 0000000..0afb8de --- /dev/null +++ b/public/vgui_controls/Controls.h @@ -0,0 +1,161 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//===========================================================================// + +#ifndef CONTROLS_H +#define CONTROLS_H + +#ifdef _WIN32 +#pragma once +#endif + +#include <vgui/VGUI.h> +#include <vgui/IPanel.h> +#include <vstdlib/IKeyValuesSystem.h> + +#include "tier1/interface.h" +#include "vgui/MouseCode.h" +#include "vgui/KeyCode.h" +#include "tier3/tier3.h" + + +namespace vgui +{ + +// handles the initialization of the vgui interfaces +// interfaces (listed below) are first attempted to be loaded from primaryProvider, then secondaryProvider +// moduleName should be the name of the module that this instance of the vgui_controls has been compiled into +bool VGui_InitInterfacesList( const char *moduleName, CreateInterfaceFn *factoryList, int numFactories ); + +// returns the name of the module as specified above +const char *GetControlsModuleName(); + +class IPanel; +class IInput; +class ISchemeManager; +class ISurface; +class ISystem; +class IVGui; + +//----------------------------------------------------------------------------- +// Backward compat interfaces, use the interfaces grabbed in tier3 +// set of accessor functions to vgui interfaces +// the appropriate header file for each is listed above the item +//----------------------------------------------------------------------------- + +// #include <vgui/IInput.h> +inline vgui::IInput *input() +{ + return g_pVGuiInput; +} + +// #include <vgui/IScheme.h> +inline vgui::ISchemeManager *scheme() +{ + return g_pVGuiSchemeManager; +} + +// #include <vgui/ISurface.h> +inline vgui::ISurface *surface() +{ + return g_pVGuiSurface; +} + +// #include <vgui/ISystem.h> +inline vgui::ISystem *system() +{ + return g_pVGuiSystem; +} + +// #include <vgui/IVGui.h> +inline vgui::IVGui *ivgui() +{ + return g_pVGui; +} + +// #include <vgui/IPanel.h> +inline vgui::IPanel *ipanel() +{ + return g_pVGuiPanel; +} + +// predeclare all the vgui control class names +class AnalogBar; +class AnimatingImagePanel; +class AnimationController; +class BuildModeDialog; +class Button; +class CheckButton; +class CheckButtonList; +class CircularProgressBar; +template< class T >class CvarToggleCheckButton; +class ComboBox; +class DirectorySelectDialog; +class Divider; +class EditablePanel; +class FileOpenDialog; +class Frame; +class GraphPanel; +class HTML; +class ImagePanel; +class Label; +class ListPanel; +class ListViewPanel; +class Menu; +class MenuBar; +class MenuButton; +class MenuItem; +class MessageBox; +class Panel; +class PanelListPanel; +class ProgressBar; +class ProgressBox; +class PropertyDialog; +class PropertyPage; +class PropertySheet; +class QueryBox; +class RadioButton; +class RichText; +class ScalableImagePanel; +class ScrollBar; +class ScrollBarSlider; +class SectionedListPanel; +class Slider; +class Splitter; +class TextEntry; +class ToggleButton; +class BaseTooltip; +class TextTooltip; +class TreeView; +class CTreeViewListControl; +class URLLabel; +class WizardPanel; +class WizardSubPanel; + +// vgui controls helper classes +class BuildGroup; +class FocusNavGroup; +class IBorder; +class IImage; +class Image; +class ImageList; +class TextImage; + +} // namespace vgui + +// hotkeys disabled until we work out exactly how we want to do them +#define VGUI_HOTKEYS_ENABLED +//#define VGUI_DRAW_HOTKEYS_ENABLED + +#define USING_BUILD_FACTORY( className ) \ + extern className *g_##className##LinkerHack; \ + className *g_##className##PullInModule = g_##className##LinkerHack; + +#define USING_BUILD_FACTORY_ALIAS( className, factoryName ) \ + extern className *g_##factoryName##LinkerHack; \ + className *g_##factoryName##PullInModule = g_##factoryName##LinkerHack; + +#endif // CONTROLS_H diff --git a/public/vgui_controls/DialogManager.h b/public/vgui_controls/DialogManager.h new file mode 100644 index 0000000..5c37616 --- /dev/null +++ b/public/vgui_controls/DialogManager.h @@ -0,0 +1,196 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef DIALOGMANAGER_H +#define DIALOGMANAGER_H + +#ifdef _WIN32 +#pragma once +#endif + +#include <utllinkedlist.h> +#include <KeyValues.h> +#include <vgui_controls/PHandle.h> + +namespace vgui +{ + +//----------------------------------------------------------------------------- +// Purpose: utility class, maps a set of ID's to dialogs +// used to manage sets of similar dialogs (object property dialogs, etc.) +//----------------------------------------------------------------------------- +template <class TDialog, class I = int> +class DialogManager +{ +public: + // new dialog factory function + typedef TDialog *(*CreateNewDialogFunc_t)(I dialogID); + + // constructor + DialogManager(CreateNewDialogFunc_t createDialogFunc); + + // finds the dialog by the specified ID + TDialog *FindDialog(I dialogID, bool bCreate); + + // opens the dialog; creating it if specified + TDialog *ActivateDialog(I dialogID, bool bCreate); + + // closes all the dialogs + void CloseAll(); + + // closes and deletes all the dialogs + void CloseAndDeleteAll(); + + // returns number of active dialogs + int Count(); + + // sets parent to use + void SetParent( vgui::VPANEL parent ); + +private: + // checks if an index in the dialog list is valid; if it has been deleted, removes the entry + bool ValidateIndex(int index); + + struct DialogItem_t + { + I id; + DHANDLE<TDialog> dlg; + }; + + CUtlLinkedList<DialogItem_t, int> m_Dialogs; + CreateNewDialogFunc_t m_CreateFunc; + vgui::VPANEL m_pVGUIParentPanel; +}; + + +// constructor +template <class TDialog, class I> +inline DialogManager<TDialog, I>::DialogManager(CreateNewDialogFunc_t createDialogFunc) +{ + m_CreateFunc = createDialogFunc; + m_pVGUIParentPanel = NULL; +} + +// finds the dialog; creating it if necessary +template <class TDialog, class I> +inline TDialog *DialogManager<TDialog, I>::FindDialog(I dialogID, bool bCreate) +{ + for (int i = 0; i < m_Dialogs.MaxElementIndex(); i++) + { + if (ValidateIndex(i) && m_Dialogs[i].id == dialogID) + { + return m_Dialogs[i].dlg; + } + } + + if (bCreate) + { + int newIndex = m_Dialogs.AddToTail(); + if (m_CreateFunc) + { + m_Dialogs[newIndex].dlg = m_CreateFunc(dialogID); + } + else + { + m_Dialogs[newIndex].dlg = new TDialog(NULL, dialogID); + } + Assert(m_pVGUIParentPanel); + m_Dialogs[newIndex].dlg->SetParent( m_pVGUIParentPanel ); + + m_Dialogs[newIndex].id = dialogID; + return m_Dialogs[newIndex].dlg; + } + + // dlg not found, not created + return NULL; +} + +// opens the dialog; creating it if necessary +template <class TDialog, class I> +inline TDialog *DialogManager<TDialog, I>::ActivateDialog(I dialogID, bool bCreate) +{ + TDialog *dlg = FindDialog(dialogID, bCreate); + if (dlg) + { + dlg->Activate(); + } + return dlg; +} + +// count +template <class TDialog, class I> +inline int DialogManager<TDialog, I>::Count() +{ + // validate all the indexes first + for (int i = 0; i < m_Dialogs.MaxElementIndex(); i++) + { + if (ValidateIndex(i)) + { + } + } + + // return the (remaining) count + return m_Dialogs.Count(); +} + +// closes all the dialogs +template <class TDialog, class I> +inline void DialogManager<TDialog, I>::CloseAll() +{ + for (int i = 0; i < m_Dialogs.MaxElementIndex(); i++) + { + if (ValidateIndex(i)) + { + m_Dialogs[i].dlg->PostMessage(m_Dialogs[i].dlg, new KeyValues("Close")); + } + } +} + +// closes and deletes all the dialogs +template <class TDialog, class I> +inline void DialogManager<TDialog, I>::CloseAndDeleteAll() +{ + CloseAll(); + for (int i = 0; i < m_Dialogs.MaxElementIndex(); i++) + { + if (ValidateIndex(i)) + { + m_Dialogs[i].dlg->MarkForDeletion(); + } + } + m_Dialogs.RemoveAll(); +} + +// checks if a dialog is valid; if it has been deleted, removes the entry +template <class TDialog, class I> +inline bool DialogManager<TDialog, I>::ValidateIndex(int index) +{ + if (m_Dialogs.IsValidIndex(index)) + { + if (m_Dialogs[index].dlg.Get()) + { + return true; + } + else + { + // entry has been deleted; removed + m_Dialogs.Remove(index); + } + } + return false; +} + +template <class TDialog, class I> +inline void DialogManager<TDialog, I>::SetParent( vgui::VPANEL parent ) +{ + m_pVGUIParentPanel = parent; +} + + +} // namespace vgui + +#endif // DIALOGMANAGER_H diff --git a/public/vgui_controls/DirectorySelectDialog.h b/public/vgui_controls/DirectorySelectDialog.h new file mode 100644 index 0000000..f024d32 --- /dev/null +++ b/public/vgui_controls/DirectorySelectDialog.h @@ -0,0 +1,96 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//=============================================================================// + +#ifndef DIRECTORYSELECTDIALOG_H +#define DIRECTORYSELECTDIALOG_H +#ifdef _WIN32 +#pragma once +#endif + +#include <vgui_controls/Controls.h> +#include <vgui_controls/TreeView.h> +#include <vgui_controls/Frame.h> + +namespace vgui +{ + +//----------------------------------------------------------------------------- +// Purpose: Used to handle dynamically populating the tree view +//----------------------------------------------------------------------------- +class DirectoryTreeView : public TreeView +{ +public: + DirectoryTreeView(DirectorySelectDialog *parent, const char *name); + virtual void GenerateChildrenOfNode(int itemIndex); + +private: + DirectorySelectDialog *m_pParent; +}; + +//----------------------------------------------------------------------------- +// Purpose: Utility dialog, used to let user select a directory (like during install) +//----------------------------------------------------------------------------- +class DirectorySelectDialog : public Frame +{ + DECLARE_CLASS_SIMPLE( DirectorySelectDialog, Frame ); + +public: + DirectorySelectDialog(vgui::Panel *parent, const char *title); + + // sets where it should start searching + void SetStartDirectory(const char *path); + + // sets what name should show up by default in the create directory dialog + void SetDefaultCreateDirectoryName(const char *defaultCreateDirName); + + // opens the dialog + void DoModal(); + + /* action signals + + "DirectorySelected" + "dir" - the directory that was selected + + */ + + // Expand the tree nodes to match a supplied path, optionally selecting the final directory + void ExpandTreeToPath( const char *lpszPath, bool bSelectFinalDirectory = true ); + +protected: + virtual void PerformLayout(); + virtual void ApplySchemeSettings(IScheme *pScheme); + virtual void OnClose(); + + // command buttons + virtual void OnCommand(const char *command); + +private: + MESSAGE_FUNC( OnTextChanged, "TextChanged" ); + MESSAGE_FUNC( OnTreeViewItemSelected, "TreeViewItemSelected" ); + MESSAGE_FUNC_CHARPTR( OnCreateDirectory, "CreateDirectory", dir ); + void BuildDirTree(); + void BuildDriveChoices(); + void ExpandTreeNode(const char *path, int parentNodeIndex); + void GenerateChildrenOfDirectoryNode(int nodeIndex); + void GenerateFullPathForNode(int nodeIndex, char *path, int pathBufferSize); + bool DoesDirectoryHaveSubdirectories(const char *path, const char *dir); + + char m_szCurrentDir[512]; + char m_szDefaultCreateDirName[64]; + char m_szCurrentDrive[16]; + vgui::TreeView *m_pDirTree; + vgui::ComboBox *m_pDriveCombo; + vgui::Button *m_pCancelButton; + vgui::Button *m_pSelectButton; + vgui::Button *m_pCreateButton; + + friend class DirectoryTreeView; +}; + +} // namespace vgui + + +#endif // DIRECTORYSELECTDIALOG_H diff --git a/public/vgui_controls/Divider.h b/public/vgui_controls/Divider.h new file mode 100644 index 0000000..1c6e7b0 --- /dev/null +++ b/public/vgui_controls/Divider.h @@ -0,0 +1,38 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef DIVIDER_H +#define DIVIDER_H + +#ifdef _WIN32 +#pragma once +#endif + +#include <vgui_controls/Panel.h> + +namespace vgui +{ + +//----------------------------------------------------------------------------- +// Purpose: Thin line used to divide sections in dialogs +//----------------------------------------------------------------------------- +class Divider : public Panel +{ + DECLARE_CLASS_SIMPLE( Divider, Panel ); + +public: + Divider(Panel *parent, const char *name); + ~Divider(); + + virtual void ApplySchemeSettings(IScheme *pScheme); +}; + + +} // namespace vgui + + +#endif // DIVIDER_H diff --git a/public/vgui_controls/EditablePanel.h b/public/vgui_controls/EditablePanel.h new file mode 100644 index 0000000..ea1f724 --- /dev/null +++ b/public/vgui_controls/EditablePanel.h @@ -0,0 +1,164 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef EDITABLEPANEL_H +#define EDITABLEPANEL_H + +#ifdef _WIN32 +#pragma once +#endif + +#include <vgui_controls/Panel.h> +#include <vgui_controls/FocusNavGroup.h> + +namespace vgui +{ + +//----------------------------------------------------------------------------- +// Purpose: Panel that supports editing via the build dialog +//----------------------------------------------------------------------------- +class EditablePanel : public Panel +{ + DECLARE_CLASS_SIMPLE( EditablePanel, Panel ); + +public: + EditablePanel(Panel *parent, const char *panelName); + EditablePanel(Panel *parent, const char *panelName, HScheme hScheme); + + virtual ~EditablePanel(); + + // Load the control settings - should be done after all the children are added + // If you pass in pPreloadedKeyValues, it won't actually load the file. That way, you can cache + // the keyvalues outside of here if you want to prevent file accesses in the middle of the game. + virtual void LoadControlSettings(const char *dialogResourceName, const char *pathID = NULL, KeyValues *pPreloadedKeyValues = NULL, KeyValues *pConditions = NULL); + virtual void ApplySettings(KeyValues *inResourceData); + + // sets the name of this dialog so it can be saved in the user config area + // use dialogID to differentiate multiple instances of the same dialog + virtual void LoadUserConfig(const char *configName, int dialogID = 0); + virtual void SaveUserConfig(); + + // combines both of the above, LoadControlSettings & LoadUserConfig + virtual void LoadControlSettingsAndUserConfig(const char *dialogResourceName, int dialogID = 0); + + // Override to change how build mode is activated + virtual void ActivateBuildMode(); + + // Return the buildgroup that this panel is part of. + virtual BuildGroup *GetBuildGroup(); + + // Virtual factory for control creation + // controlName is a string which is the same as the class name + virtual Panel *CreateControlByName(const char *controlName); + + // Shortcut function to set data in child controls + virtual void SetControlString(const char *controlName, const char *string); + // Shortcut function to set data in child controls + virtual void SetControlString(const char *controlName, const wchar_t *string); + // Shortcut function to set data in child controls + virtual void SetControlInt(const char *controlName, int state); + // Shortcut function to get data in child controls + virtual int GetControlInt(const char *controlName, int defaultState); + // Shortcut function to get data in child controls + // Returns a maximum of 511 characters in the string + virtual const char *GetControlString(const char *controlName, const char *defaultString = ""); + // as above, but copies the result into the specified buffer instead of a static buffer + virtual void GetControlString(const char *controlName, char *buf, int bufSize, const char *defaultString = ""); + // sets the enabled state of a control + virtual void SetControlEnabled(const char *controlName, bool enabled); + virtual void SetControlVisible(const char *controlName, bool visible, bool bRecurseDown = false ); + + // localization variables (used in constructing UI strings) + // after the variable is set, causes all the necessary sub-panels to update + virtual void SetDialogVariable(const char *varName, const char *value); + virtual void SetDialogVariable(const char *varName, const wchar_t *value); + virtual void SetDialogVariable(const char *varName, int value); + virtual void SetDialogVariable(const char *varName, float value); + + // Focus handling + // Delegate focus to a sub panel + virtual void RequestFocus(int direction = 0); + virtual bool RequestFocusNext(VPANEL panel); + virtual bool RequestFocusPrev(VPANEL panel); + // Pass the focus down onto the last used panel + virtual void OnSetFocus(); + // Update focus info for navigation + virtual void OnRequestFocus(VPANEL subFocus, VPANEL defaultPanel); + // Get the panel that currently has keyfocus + virtual VPANEL GetCurrentKeyFocus(); + // Get the panel with the specified hotkey + virtual Panel *HasHotkey(wchar_t key); + + virtual void OnKeyCodePressed( KeyCode code ); + + // Handle information requests + virtual bool RequestInfo(KeyValues *data); + /* INFO HANDLING + "BuildDialog" + input: + "BuildGroupPtr" - pointer to the panel/dialog to edit + returns: + "PanelPtr" - pointer to a new BuildModeDialog() + + "ControlFactory" + input: + "ControlName" - class name of the control to create + returns: + "PanelPtr" - pointer to the newly created panel, or NULL if no such class exists + */ + // registers a file in the list of control settings, so the vgui dialog can choose between them to edit + virtual void RegisterControlSettingsFile(const char *dialogResourceName, const char *pathID = NULL); + + // localization variables - only use this if you need to iterate the variables, use the SetLoc*() to set them + KeyValues *GetDialogVariables(); + + bool ShouldSkipAutoResize() const { return m_bShouldSkipAutoResize; } +protected: + virtual void PaintBackground(); + + // nav group access + virtual FocusNavGroup &GetFocusNavGroup(); + + // called when default button has been set + MESSAGE_FUNC_HANDLE( OnDefaultButtonSet, "DefaultButtonSet", button ); + // called when the current default button has been set + MESSAGE_FUNC_HANDLE( OnCurrentDefaultButtonSet, "CurrentDefaultButtonSet", button ); + MESSAGE_FUNC( OnFindDefaultButton, "FindDefaultButton" ); + + // overrides + virtual void OnChildAdded(VPANEL child); + virtual void OnSizeChanged(int wide, int tall); + virtual void OnClose(); + + // user configuration settings + // this is used for any control details the user wants saved between sessions + // eg. dialog positions, last directory opened, list column width + virtual void ApplyUserConfigSettings(KeyValues *userConfig); + + // returns user config settings for this control + virtual void GetUserConfigSettings(KeyValues *userConfig); + + // optimization for text rendering, returns true if text should be rendered immediately after Paint() + // disabled for now + // virtual bool ShouldFlushText(); + +private: + void ForceSubPanelsToUpdateWithNewDialogVariables(); + + BuildGroup *_buildGroup; + FocusNavGroup m_NavGroup; + KeyValues *m_pDialogVariables; + + // the wide and tall to which all controls are locked - used for autolayout deltas + char *m_pszConfigName; + int m_iConfigID; + bool m_bShouldSkipAutoResize; +}; + +} // namespace vgui + +#endif // EDITABLEPANEL_H diff --git a/public/vgui_controls/ExpandButton.h b/public/vgui_controls/ExpandButton.h new file mode 100644 index 0000000..2dbf849 --- /dev/null +++ b/public/vgui_controls/ExpandButton.h @@ -0,0 +1,61 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: A button with no borders that shows a left-pointing or down-pointing triangle +// +// $NoKeywords: $ +//===========================================================================// + +#ifndef EXPANDBUTTON_H +#define EXPANDBUTTON_H + +#ifdef _WIN32 +#pragma once +#endif + +#include <vgui/VGUI.h> +#include <vgui_controls/ToggleButton.h> + + +namespace vgui +{ + +//----------------------------------------------------------------------------- +// Purpose: A button with no borders that shows a left-pointing or down-pointing arrow +//----------------------------------------------------------------------------- +class ExpandButton : public ToggleButton +{ + DECLARE_CLASS_SIMPLE( ExpandButton, ToggleButton ); + +public: + ExpandButton( Panel *parent, const char *panelName ); + ~ExpandButton(); + + // Expand the button (selected == expanded) + virtual void SetSelected( bool bExpand ); + + // sets whether or not the state of the check can be changed + // if this is set to false, then no input in the code or by the user can change it's state + void SetExpandable(bool state); + + virtual void Paint(); + +protected: + virtual void ApplySchemeSettings(IScheme *pScheme); + MESSAGE_FUNC_PTR( OnExpanded, "Expanded", panel ); + + virtual IBorder *GetBorder(bool depressed, bool armed, bool selected, bool keyfocus); + + /* MESSAGES SENT + "Expanded" - sent when the expand button state is changed + "state" - button state: 1 is expanded, 0 is unexpanded + */ + +private: + bool m_bExpandable; + HFont m_hFont; + Color m_Color; +}; + +} // namespace vgui + +#endif // EXPANDBUTTON_H diff --git a/public/vgui_controls/FileOpenDialog.h b/public/vgui_controls/FileOpenDialog.h new file mode 100644 index 0000000..bcaccf0 --- /dev/null +++ b/public/vgui_controls/FileOpenDialog.h @@ -0,0 +1,160 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: Declaration of FileOpenDialog class, a generic open/save as file dialog +// +// $NoKeywords: $ +//===========================================================================// + +#ifndef FILEOPENDIALOG_H +#define FILEOPENDIALOG_H + +#ifdef _WIN32 +#pragma once +#endif + +#include "vgui_controls/Frame.h" + +namespace vgui +{ + +class FileCompletionEdit; // local +class InputDialog; + +//----------------------------------------------------------------------------- +// Purpose: generic open/save as file dialog +//----------------------------------------------------------------------------- +enum FileOpenDialogType_t +{ + FOD_SAVE = 0, + FOD_OPEN, + FOD_SELECT_DIRECTORY, +}; + + +class FileOpenDialog : public vgui::Frame +{ + DECLARE_CLASS_SIMPLE( FileOpenDialog, Frame ); + +public: + // NOTE: Backward compat constructor + FileOpenDialog( Panel *parent, const char *title, bool bOpenFile, KeyValues *pContextKeyValues = 0 ); + + // The context keyvalues are added to all messages sent by this dialog if they are specified + FileOpenDialog( Panel *parent, const char *title, FileOpenDialogType_t type, KeyValues *pContextKeyValues = 0 ); + ~FileOpenDialog(); + + // Set the directory the file search starts in + void SetStartDirectory(const char *dir); + + // Sets the start directory context (and resets the start directory in the process) + // NOTE: If you specify a startdir context, then if you've already opened + // a file with that same start dir context before, it will start in the + // same directory it ended up in. + void SetStartDirectoryContext( const char *pContext, const char *pDefaultDir ); + + // Add filters for the drop down combo box + // The filter info, if specified, gets sent back to the app in the FileSelected message + void AddFilter( const char *filter, const char *filterName, bool bActive, const char *pFilterInfo = NULL ); + + // Activate the dialog + // NOTE: The argument is there for backward compat + void DoModal( bool bUnused = false ); + + // Get the directory this is currently in + void GetCurrentDirectory( char *buf, int bufSize ); + + // Get the last selected file name + void GetSelectedFileName( char *buf, int bufSize ); + + /* + messages sent: + "FileSelected" + "fullpath" // specifies the fullpath of the file + "filterinfo" // Returns the filter info associated with the active filter + "FileSelectionCancelled" + */ + +protected: + virtual void OnCommand( const char *command ); + virtual void ApplySchemeSettings(IScheme *pScheme); + virtual void OnClose(); + virtual void OnKeyCodeTyped(KeyCode code); + + // handles the open button being pressed + // checks on what has changed and acts accordingly + MESSAGE_FUNC( OnOpen, "OnOpen" ); + MESSAGE_FUNC( OnSelectFolder, "SelectFolder" ); + MESSAGE_FUNC( OnFolderUp, "OnFolderUp" ); + MESSAGE_FUNC( OnNewFolder, "OnNewFolder" ); + MESSAGE_FUNC( OnOpenInExplorer, "OpenInExplorer" ); + + MESSAGE_FUNC( PopulateFileList, "PopulateFileList" ); + MESSAGE_FUNC( PopulateDriveList, "PopulateDriveList" ); + MESSAGE_FUNC( PopulateFileNameCompletion, "PopulateFileNameCompletion" ); + + // moves the directory structure up + virtual void MoveUpFolder(); + + // validates that the current path is valid + virtual void ValidatePath(); + + // handles an item in the list being selected + MESSAGE_FUNC( OnItemSelected, "ItemSelected" ); + MESSAGE_FUNC( OnListItemSelected, "ListItemSelected" ) + { + OnItemSelected(); + } + + // changes directories in response to selecting drives from the combo box + MESSAGE_FUNC_PARAMS( OnTextChanged, "TextChanged", kv ); + + MESSAGE_FUNC( OnInputCanceled, "InputCanceled" ); + MESSAGE_FUNC_PARAMS( OnInputCompleted, "InputCompleted", data ); + +private: + // Necessary because we have 2 constructors + void Init( const char *title, KeyValues *pContextKeyValues ); + + // Does the specified extension match something in the filter list? + bool ExtensionMatchesFilter( const char *pExt ); + + // Choose the first non *.* filter in the filter list + void ChooseExtension( char *pExt, int nBufLen ); + + // Saves the file to the start dir context + void SaveFileToStartDirContext( const char *pFullPath ); + + // Posts a file selected message + void PostFileSelectedMessage( const char *pFileName ); + + // Creates a new folder + void NewFolder( char const *folderName ); + + vgui::ComboBox *m_pFullPathEdit; + vgui::ListPanel *m_pFileList; + + FileCompletionEdit *m_pFileNameEdit; + + vgui::ComboBox *m_pFileTypeCombo; + vgui::Button *m_pOpenButton; + vgui::Button *m_pCancelButton; + vgui::Button *m_pFolderUpButton; + vgui::Button *m_pNewFolderButton; + vgui::Button *m_pOpenInExplorerButton; + vgui::ImagePanel *m_pFolderIcon; + vgui::Label *m_pFileTypeLabel; + + KeyValues *m_pContextKeyValues; + + char m_szLastPath[1024]; + unsigned short m_nStartDirContext; + FileOpenDialogType_t m_DialogType; + bool m_bFileSelected : 1; + + VPANEL m_SaveModal; + vgui::DHANDLE< vgui::InputDialog > m_hInputDialog; +}; + +} // namespace vgui + +#endif // FILEOPENDIALOG_H diff --git a/public/vgui_controls/FileOpenStateMachine.h b/public/vgui_controls/FileOpenStateMachine.h new file mode 100644 index 0000000..4fb327c --- /dev/null +++ b/public/vgui_controls/FileOpenStateMachine.h @@ -0,0 +1,172 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// This is a helper class designed to help with the chains of modal dialogs +// encountered when trying to open or save a particular file +// +//============================================================================= + +#ifndef FILEOPENSTATEMACHINE_H +#define FILEOPENSTATEMACHINE_H + +#ifdef _WIN32 +#pragma once +#endif + +#include "vgui_controls/Panel.h" +#include "tier1/utlstring.h" + +//----------------------------------------------------------------------------- +// Forward declarations +//----------------------------------------------------------------------------- + + +namespace vgui +{ + +//----------------------------------------------------------------------------- +// Interface for things using the file open state machine +//----------------------------------------------------------------------------- +abstract_class IFileOpenStateMachineClient +{ +public: + // Called by to allow clients to set up the save dialog + virtual void SetupFileOpenDialog( vgui::FileOpenDialog *pDialog, bool bOpenFile, const char *pFileFormat, KeyValues *pContextKeyValues ) = 0; + + // Called by to allow clients to actually read the file in + virtual bool OnReadFileFromDisk( const char *pFileName, const char *pFileFormat, KeyValues *pContextKeyValues ) = 0; + + // Called by to allow clients to actually write the file out + virtual bool OnWriteFileToDisk( const char *pFileName, const char *pFileFormat, KeyValues *pContextKeyValues ) = 0; +}; + + +//----------------------------------------------------------------------------- +// This is a helper class designed to help with chains of modal dialogs +//----------------------------------------------------------------------------- +enum FileOpenStateMachineFlags_t +{ + FOSM_SHOW_PERFORCE_DIALOGS = 0x1, + FOSM_SHOW_SAVE_QUERY = 0x2, +}; + +class FileOpenStateMachine : public Panel +{ + DECLARE_CLASS_SIMPLE( FileOpenStateMachine, Panel ); + +public: + enum CompletionState_t + { + IN_PROGRESS = 0, // Still not finished, not successful or error + SUCCESSFUL, // Operation finished successfully + FILE_SAVE_CANCELLED, // The user chose 'cancel' in the dialog asking if he wanted to save + FILE_SAVE_NAME_NOT_SPECIFIED, // User hit cancel in the SaveAs dialog + FILE_NOT_OVERWRITTEN, // Operation aborted; existed file and user chose to not write over it + FILE_NOT_CHECKED_OUT, // Operation aborted; file wasn't checked out so couldn't be written over + ERROR_WRITING_FILE, // Error occurred writing the file out + ERROR_MAKING_FILE_WRITEABLE, // Error occurred when making the file writeable + FILE_NOT_MADE_WRITEABLE, // User chose to not make the file be writeable + FILE_OPEN_NAME_NOT_SPECIFIED, // User hit cancel in the Open dialog + ERROR_READING_FILE, // Error occurred reading the file in + }; + + FileOpenStateMachine( vgui::Panel *pParent, IFileOpenStateMachineClient *pClient ); + virtual ~FileOpenStateMachine(); + + // Opens a file, saves an existing one if necessary + void OpenFile( const char *pOpenFileType, KeyValues *pContextKeyValues, const char *pSaveFileName = NULL, const char *pSaveFileType = NULL, int nFlags = 0 ); + + // Version of OpenFile that skips browsing for a particular file to open + void OpenFile( const char *pOpenFileName, const char *pOpenFileType, KeyValues *pContextKeyValues, const char *pSaveFileName = NULL, const char *pSaveFileType = NULL, int nFlags = 0 ); + + // Used to save a specified file, and deal with all the lovely dialogs + // Pass in NULL to get a dialog to choose a filename to save + void SaveFile( KeyValues *pContextKeyValues, const char *pFileName, const char *pFileType, int nFlags = FOSM_SHOW_PERFORCE_DIALOGS ); + + // Returns the state machine completion state + CompletionState_t GetCompletionState(); + + /* MESSAGES SENT + "FileStateMachineFinished" - Called when we exit the state machine for any reason + "completionState" - See the CompletionState_t enum above + "wroteFile" - Indicates whether a file was written or not + "fullPath" - Indicates the full path of the file read for OpenFile or written for SaveFile + "fileType" - Indicates the file type of the file read for OpenFile or written for SaveFile + Use GetFirstTrueSubKey() to get the context passed into the OpenFile/SaveFile methods + */ + +private: + enum FOSMState_t + { + STATE_NONE = -1, + STATE_SHOWING_SAVE_DIRTY_FILE_DIALOG = 0, + STATE_SHOWING_SAVE_DIALOG, + STATE_SHOWING_OVERWRITE_DIALOG, + STATE_SHOWING_CHECK_OUT_DIALOG, + STATE_SHOWING_MAKE_FILE_WRITEABLE_DIALOG, + STATE_WRITING_FILE, + STATE_SHOWING_PERFORCE_ADD_DIALOG, + STATE_SHOWING_OPEN_DIALOG, + STATE_READING_FILE, + }; + + MESSAGE_FUNC_PARAMS( OnFileSelected, "FileSelected", pKeyValues ); + MESSAGE_FUNC( OnFileSelectionCancelled, "FileSelectionCancelled" ); + MESSAGE_FUNC_PARAMS( OnPerforceQueryCompleted, "PerforceQueryCompleted", pKeyValues ); + MESSAGE_FUNC( OnMakeFileWriteable, "MakeFileWriteable" ); + MESSAGE_FUNC( OnCancelMakeFileWriteable, "CancelMakeFileWriteable" ); + + // These messages are related to the dialog in OverwriteFileDialog + MESSAGE_FUNC( OnOverwriteFile, "OverwriteFile" ); + MESSAGE_FUNC( OnCancelOverwriteFile, "CancelOverwriteFile" ); + + // These messages come from the savedocumentquery dialog + MESSAGE_FUNC( OnSaveFile, "OnSaveFile" ); + MESSAGE_FUNC( OnMarkNotDirty, "OnMarkNotDirty" ); + MESSAGE_FUNC( OnCancelSaveDocument, "OnCancelSaveDocument" ); + + // Cleans up keyvalues + void CleanUpContextKeyValues(); + + // Utility to set the completion state + void SetCompletionState( CompletionState_t state ); + + // Show the save document query dialog + void ShowSaveQuery( ); + + // Shows the overwrite existing file dialog + void OverwriteFileDialog( ); + + // Shows the open file for edit dialog + void CheckOutDialog( ); + + // Shows the make file writeable dialog + void MakeFileWriteableDialog( ); + + // Writes the file out + void WriteFile(); + + // Shows the open file dialog + void OpenFileDialog( ); + + // Reads the file in + void ReadFile(); + + IFileOpenStateMachineClient *m_pClient; + KeyValues *m_pContextKeyValues; + FOSMState_t m_CurrentState; + CompletionState_t m_CompletionState; + CUtlString m_FileName; + CUtlString m_SaveFileType; + CUtlString m_OpenFileType; + CUtlString m_OpenFileName; + bool m_bShowPerforceDialogs : 1; + bool m_bShowSaveQuery : 1; + bool m_bIsOpeningFile : 1; + bool m_bWroteFile : 1; +}; + +} // end namespace vgui + + + +#endif // FILEOPENSTATEMACHINE_H diff --git a/public/vgui_controls/FocusNavGroup.h b/public/vgui_controls/FocusNavGroup.h new file mode 100644 index 0000000..2d74351 --- /dev/null +++ b/public/vgui_controls/FocusNavGroup.h @@ -0,0 +1,61 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef FOCUSNAVGROUP_H +#define FOCUSNAVGROUP_H + +#ifdef _WIN32 +#pragma once +#endif + +#include <vgui/VGUI.h> +#include <vgui_controls/PHandle.h> + +namespace vgui +{ + +class Panel; + +//----------------------------------------------------------------------------- +// Purpose: Handles navigation through a set of panels, with tab order & hotkeys +//----------------------------------------------------------------------------- +class FocusNavGroup +{ +public: + FocusNavGroup(Panel *panel); + ~FocusNavGroup(); + virtual Panel *GetDefaultPanel(); // returns a pointer to the panel with the default focus + + virtual void SetDefaultButton(Panel *panel); // sets which panel should receive input when ENTER is hit + virtual VPANEL GetDefaultButton(); // panel which receives default input when ENTER is hit, if current focused item cannot accept ENTER + virtual VPANEL GetCurrentDefaultButton(); // panel which receives input when ENTER is hit + virtual Panel *FindPanelByHotkey(wchar_t key); // finds the panel which is activated by the specified key + virtual bool RequestFocusPrev(VPANEL panel = NULL); // if panel is NULL, then the tab increment is based last known panel that had key focus + virtual bool RequestFocusNext(VPANEL panel = NULL); + + virtual Panel *GetCurrentFocus(); + virtual VPANEL SetCurrentFocus(VPANEL panel, VPANEL defaultPanel); // returns the Default panel + + // sets the panel that owns this FocusNavGroup to be the root in the focus traversal heirarchy + // focus change via KEY_TAB will only travel to children of this main panel + virtual void SetFocusTopLevel(bool state); + + virtual void SetCurrentDefaultButton(VPANEL panel, bool sendCurrentDefaultButtonMessage = true); +private: + bool CanButtonBeDefault(VPANEL panel); + + VPanelHandle _defaultButton; + VPanelHandle _currentDefaultButton; + VPanelHandle _currentFocus; + + Panel *_mainPanel; + bool _topLevelFocus; +}; + +} // namespace vgui + +#endif // FOCUSNAVGROUP_H diff --git a/public/vgui_controls/Frame.h b/public/vgui_controls/Frame.h new file mode 100644 index 0000000..0485a37 --- /dev/null +++ b/public/vgui_controls/Frame.h @@ -0,0 +1,260 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef VGUI_FRAME_H +#define VGUI_FRAME_H + +#ifdef _WIN32 +#pragma once +#endif + +#include <vgui/VGUI.h> +#include <vgui/Dar.h> +#include <vgui_controls/Panel.h> +#include <vgui_controls/EditablePanel.h> +#include <vgui_controls/FocusNavGroup.h> + +namespace vgui +{ + +class FrameButton; +class FrameSystemButton; + +//----------------------------------------------------------------------------- +// Purpose: Windowed frame +//----------------------------------------------------------------------------- +class Frame : public EditablePanel +{ + DECLARE_CLASS_SIMPLE( Frame, EditablePanel ); + +public: + Frame(Panel *parent, const char *panelName, bool showTaskbarIcon = true, bool bPopup = true ); + virtual ~Frame(); + + // Set the text in the title bar. Set surfaceTitle=true if you want this to be the taskbar text as well. + virtual void SetTitle(const char *title, bool surfaceTitle); + virtual void SetTitle(const wchar_t *title, bool surfaceTitle); + + // Bring the frame to the front and requests focus, ensures it's not minimized + virtual void Activate(); + + // activates the dialog; if dialog is not currently visible it starts it minimized and flashing in the taskbar + virtual void ActivateMinimized(); + + // closes the dialog + MESSAGE_FUNC( Close, "Close" ); + MESSAGE_FUNC( CloseModal, "CloseModal" ); + + // sets the dialog to delete self on close + virtual void SetDeleteSelfOnClose( bool state ); + + // Move the dialog to the center of the screen + virtual void MoveToCenterOfScreen(); + + // Set the movability of the panel + virtual void SetMoveable(bool state); + // Check the movability of the panel + virtual bool IsMoveable(); + + // Set the resizability of the panel + virtual void SetSizeable(bool state); + // Check the resizability of the panel + virtual bool IsSizeable(); + // Toggle visibility of the system menu button + virtual void SetMenuButtonVisible(bool state); + void SetMenuButtonResponsive(bool state); + + // Toggle visibility of the minimize button + virtual void SetMinimizeButtonVisible(bool state); + // Toggle visibility of the maximize button + virtual void SetMaximizeButtonVisible(bool state); + // Toggles visibility of the minimize-to-systray icon (defaults to false) + virtual void SetMinimizeToSysTrayButtonVisible(bool state); + + // Toggle visibility of the close button + virtual void SetCloseButtonVisible(bool state); + + // returns true if the dialog is currently minimized + virtual bool IsMinimized(); + // Flash the window system tray button until the frame gets focus + virtual void FlashWindow(); + // Stops any window flashing + virtual void FlashWindowStop(); + // command handling + virtual void OnCommand(const char *command); + + // Get the system menu + virtual Menu *GetSysMenu(); + // Set the system menu + virtual void SetSysMenu(Menu *menu); + + // Set the system menu images + void SetImages( const char *pEnabledImage, const char *pDisabledImage = NULL ); + + // set whether the title bar should be rendered + virtual void SetTitleBarVisible( bool state ); + + // When moving via caption, don't let any part of window go outside parent's bounds + virtual void SetClipToParent( bool state ); + virtual bool GetClipToParent() const; + + // Set to true to make the caption height small + virtual void SetSmallCaption( bool state ); + virtual bool IsSmallCaption() const; + + virtual int GetDraggerSize(); + virtual int GetCornerSize(); + virtual int GetBottomRightSize(); + virtual int GetCaptionHeight(); + + /* CUSTOM MESSAGE HANDLING + "SetTitle" + input: "text" - string to set the title to be + */ + + // Load the control settings + virtual void LoadControlSettings( const char *dialogResourceName, const char *pathID = NULL, KeyValues *pPreloadedKeyValues = NULL, KeyValues *pConditions = NULL ); + + void SetChainKeysToParent( bool state ); + bool CanChainKeysToParent() const; + + // Shows the dialog in a modal fashion + virtual void DoModal(); + + void PlaceUnderCursor( ); + + // Disables the fade-in/out-effect even if configured in the scheme settings + void DisableFadeEffect( void ); + + // Temporarily enables or disables the fade effect rather than zeroing the fade times as done in DisableFadeEffect + void SetFadeEffectDisableOverride( bool disabled ); + +protected: + // Respond to mouse presses + virtual void OnMousePressed(MouseCode code); + // Respond to Key typing + virtual void OnKeyCodeTyped(KeyCode code); + virtual void OnKeyTyped(wchar_t unichar); + // Respond to Key releases + virtual void OnKeyCodeReleased(KeyCode code); + // Respond to Key focus ticks + virtual void OnKeyFocusTicked(); + virtual void ApplySchemeSettings(IScheme *pScheme); + // Recalculate the position of all items + virtual void PerformLayout(); + // Respond when a close message is recieved. Can be called directly to close a frame. + virtual void OnClose(); + // Respond to a window finishing its closure. i.e. when a fading window has fully finished its fadeout. + virtual void OnFinishedClose(); + // Minimize the window on the taskbar. + MESSAGE_FUNC( OnMinimize, "Minimize" ); + // Called when minimize-to-systray button is pressed (does nothing by default) + virtual void OnMinimizeToSysTray(); + // the frame close button was pressed + MESSAGE_FUNC( OnCloseFrameButtonPressed, "CloseFrameButtonPressed" ); + // Add the child to the focus nav group + virtual void OnChildAdded(VPANEL child); + // settings + virtual void ApplySettings(KeyValues *inResourceData); + // records the settings into the resource data + virtual void GetSettings(KeyValues *outResourceData); + virtual const char *GetDescription( void ); + + // gets the default position and size on the screen to appear the first time (defaults to centered) + virtual bool GetDefaultScreenPosition(int &x, int &y, int &wide, int &tall); + + // painting + virtual void PaintBackground(); + + // per-frame thinking, used for transition effects + virtual void OnThink(); + + // screen size + virtual void OnScreenSizeChanged(int iOldWide, int iOldTall); + + // Get the size of the panel inside the frame edges. + virtual void GetClientArea(int &x, int &y, int &wide, int &tall); + + // user configuration settings + // this is used for any control details the user wants saved between sessions + // eg. dialog positions, last directory opened, list column width + virtual void ApplyUserConfigSettings(KeyValues *userConfig); + + // returns user config settings for this control + virtual void GetUserConfigSettings(KeyValues *userConfig); + + // optimization, return true if this control has any user config settings + virtual bool HasUserConfigSettings(); + +private: + MESSAGE_FUNC_CHARPTR( InternalSetTitle, "SetTitle", text ); + MESSAGE_FUNC( InternalFlashWindow, "FlashWindow" ); + MESSAGE_FUNC_PARAMS( OnDialogVariablesChanged, "DialogVariables", dialogVariables ); + + void SetupResizeCursors(); + void LayoutProportional( FrameButton *bt); + void FinishClose(); + void OnFrameFocusChanged(bool bHasFocus); + + Color _titleBarBgColor; + Color _titleBarDisabledBgColor; + Color _titleBarFgColor; + Color _titleBarDisabledFgColor; + Color m_InFocusBgColor; + Color m_OutOfFocusBgColor; + TextImage *_title; + +#if !defined( _X360 ) + Panel *_topGrip; + Panel *_bottomGrip; + Panel *_leftGrip; + Panel *_rightGrip; + Panel *_topLeftGrip; + Panel *_topRightGrip; + Panel *_bottomLeftGrip; + Panel *_bottomRightGrip; + Panel *_captionGrip; + FrameButton *_minimizeButton; + FrameButton *_maximizeButton; + FrameButton *_minimizeToSysTrayButton; + FrameButton *_closeButton; + FrameSystemButton *_menuButton; + Menu *_sysMenu; +#endif + + float m_flTransitionEffectTime; + float m_flFocusTransitionEffectTime; + int m_iClientInsetX; + int m_iClientInsetY; + int m_iTitleTextInsetX; + int m_nGripperWidth; + VPANEL m_hPreviousModal; + HFont m_hCustomTitleFont; + + bool _sizeable : 1; + bool _moveable : 1; + bool m_bHasFocus : 1; + bool _flashWindow : 1; + bool _nextFlashState : 1; + bool _drawTitleBar : 1; + bool m_bPreviouslyVisible : 1; + bool m_bFadingOut : 1; + bool m_bDeleteSelfOnClose : 1; + bool m_bDisableFadeEffect : 1; + bool m_bClipToParent : 1; + bool m_bSmallCaption : 1; + bool m_bChainKeysToParent : 1; + bool m_bPrimed : 1; + bool m_iClientInsetXOverridden : 1; + + CPanelAnimationVarAliasType( int, m_iTitleTextInsetXOverride, "titletextinsetX", "0", "proportional_int" ); + CPanelAnimationVar( int, m_iTitleTextInsetYOverride, "titletextinsetY", "0" ); +}; + +} // namespace vgui + +#endif // VGUI_FRAME_H diff --git a/public/vgui_controls/GraphPanel.h b/public/vgui_controls/GraphPanel.h new file mode 100644 index 0000000..e2c2bfe --- /dev/null +++ b/public/vgui_controls/GraphPanel.h @@ -0,0 +1,81 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//=============================================================================// + +#ifndef GRAPHPANEL_H +#define GRAPHPANEL_H +#ifdef _WIN32 +#pragma once +#endif + +#include <vgui_controls/Panel.h> +#include "utllinkedlist.h" +#include "utlvector.h" + +namespace vgui +{ + +//----------------------------------------------------------------------------- +// Purpose: Holds and displays a chart +//----------------------------------------------------------------------------- +class GraphPanel : public Panel +{ + DECLARE_CLASS_SIMPLE( GraphPanel, Panel ); + +public: + GraphPanel(Panel *parent, const char *name); + + // domain settings (x-axis settings) + // sets the window of samples to display + void SetDisplayDomainSize(float size); + // sets the range of samples the graph should keep + // should be set to the max you would set the display domain size + void SetMaxDomainSize(float size); + // sets the minimum domain that will be displayed; used to collapse samples + void SetMinDomainSize(float size); + + // range settings (y-axis settings) + void SetUseFixedRange(float lowRange, float highRange); + void SetUseDynamicRange(float *rangeList, int numRanges); + void GetDisplayedRange(float &lowRange, float &highRange); + + // adds an item to the end of the list + // sampleEnd is assumed to be the trailing edge of the sample + // assumes that the samples are fairly evenly spaced (not much more work to do to fix this though) + void AddItem(float sampleEnd, float sampleValue); + +protected: + virtual void Paint(); + virtual void PerformLayout(); + virtual void ApplySchemeSettings(IScheme *pScheme); + +private: + int GetVisibleItemCount(); + + struct Sample_t + { + float sampleEnd; + float value; + }; + CUtlLinkedList<Sample_t, int> m_Samples; + + // the window to show + float m_flDomainSize; + float m_flMaxDomainSize, m_flMinDomainSize; + bool m_bMaxDomainSizeSet; + + // range + float m_flLowRange, m_flHighRange; + bool m_bUseDynamicRange; + CUtlVector<float> m_RangeList; + + // rendering + int m_iGraphBarWidth; + int m_iGraphBarGapWidth; +}; + +} // namespace vgui + +#endif // GRAPHPANEL_H diff --git a/public/vgui_controls/HTML.h b/public/vgui_controls/HTML.h new file mode 100644 index 0000000..ad786d2 --- /dev/null +++ b/public/vgui_controls/HTML.h @@ -0,0 +1,323 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: Creates a HTML control +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef HTML_H +#define HTML_H + +#ifdef _WIN32 +#pragma once +#endif + +#include <vgui/VGUI.h> +#include <vgui/IImage.h> +#include <vgui_controls/Panel.h> +#include <vgui_controls/PHandle.h> +#include <vgui_controls/FileOpenDialog.h> +#include <vgui_controls/TextEntry.h> +#include <tier1/utlmap.h> +#ifndef VERSION_SAFE_STEAM_API_INTERFACES +#define VERSION_SAFE_STEAM_API_INTERFACES +#endif +#include "steam/steam_api.h" + +namespace vgui +{ + +//----------------------------------------------------------------------------- +// Purpose: Control to display HTML content +// This control utilises a hidden IE window to render a HTML page for you. +// It can load any valid URL (i.e local files or web pages), you cannot dynamically change the +// content however (internally to the control that is). +//----------------------------------------------------------------------------- +class HTML: public Panel +{ + DECLARE_CLASS_SIMPLE( HTML, Panel ); + // TODO::STYLE + //DECLARE_STYLE_BASE( "HTML" ); +public: + + HTML(Panel *parent,const char *name, bool allowJavaScript = false, bool bPopupWindow = false); + ~HTML(); + + // IHTML pass through functions + virtual void OpenURL( const char *URL, const char *pchPostData, bool bForce = false ); + virtual bool StopLoading(); + virtual bool Refresh(); + virtual void OnMove(); + virtual void RunJavascript( const char *pchScript ); + virtual void GoBack(); + virtual void GoForward(); + virtual bool BCanGoBack(); + virtual bool BCanGoFoward(); + + // event functions you can override and specialize behavior of + virtual bool OnStartRequest( const char *url, const char *target, const char *pchPostData, bool bIsRedirect ); + virtual void OnFinishRequest(const char *url, const char *pageTitle, const CUtlMap < CUtlString, CUtlString > &headers ) {} + virtual void OnSetHTMLTitle( const char *pchTitle ) {} + virtual void OnLinkAtPosition( const char *pchURL ) {} + virtual void OnURLChanged( const char *url, const char *pchPostData, bool bIsRedirect ) {} + + virtual bool OnOpenNewTab( const char *pchURL, bool bForeground ) { return false; } + + // configuration + virtual void SetScrollbarsEnabled(bool state); + virtual void SetContextMenuEnabled(bool state); + virtual void SetViewSourceEnabled( bool state ); + virtual void NewWindowsOnly( bool state ); + + bool IsScrolledToBottom(); + bool IsScrollbarVisible(); + + // url handlers, lets you have web page links fire vgui events + // use to have custom web page links, eg. "steam://open/subscriptionpage" + // message contains "CustomURL", "url" + virtual void AddCustomURLHandler(const char *customProtocolName, vgui::Panel *target); + + // overridden to paint our special web browser texture + virtual void Paint(); + + // pass messages to the texture component to tell it about resizes + virtual void OnSizeChanged(int wide,int tall); + + // pass mouse clicks through + virtual void OnMousePressed(MouseCode code); + virtual void OnMouseReleased(MouseCode code); + virtual void OnCursorMoved(int x,int y); + virtual void OnMouseDoublePressed(MouseCode code); + virtual void OnKeyTyped(wchar_t unichar); + virtual void OnKeyCodeTyped(KeyCode code); + virtual void OnKeyCodeReleased(KeyCode code); + virtual void PerformLayout(); + virtual void OnMouseWheeled(int delta); + virtual void PostChildPaint(); + + /* message posting: + + "HTMLSliderMoved" - indicates the scrollbar has moved + + "OnURLChanged" - indicates a new URL is being loaded + "url" + "postdata" + + "OnFinishRequest" - indicates all url loaded has completed + + "HTMLBackRequested" - mouse4 has been pressed on the dialog + "HTMLForwardRequested" - mouse5 has been pressed on the dialog + + "SecurityStatus" - indicates the SSL status of the page (disabled,good,bad) + "url" + "secure" - true if an ssl page + "certerror" - true if there is a cert error loading the page + "isevcert" - true if this is an EV style cert + "certname" - name of the entity this cert is issued to + */ + + MESSAGE_FUNC_INT( OnSetCursorVGUI, "SetCursor", cursor ); + + virtual void OnCommand( const char *pchCommand ); + + void AddHeader( const char *pchHeader, const char *pchValue ); + void OnKillFocus(); + void OnSetFocus(); + + void Find( const char *pchSubStr ); + void StopFind(); + void FindNext(); + void FindPrevious(); + void ShowFindDialog(); + void HideFindDialog(); + bool FindDialogVisible(); + int HorizontalScrollMax() { return m_scrollHorizontal.m_nMax; } + int VerticalScrollMax() { return m_scrollVertical.m_nMax; } + + void GetLinkAtPosition( int x, int y ); + + void HidePopup(); + +#ifdef DBGFLAG_VALIDATE + virtual void Validate( CValidator &validator, const char *pchName ) + { + ValidateObj( m_CustomURLHandlers ); + BaseClass::Validate( validator, pchName ); + } +#endif // DBGFLAG_VALIDATE + + ISteamHTMLSurface *SteamHTMLSurface() { return m_SteamAPIContext.SteamHTMLSurface(); } + + void OnHTMLMouseMoved( int x, int y ) + { + if ( m_SteamAPIContext.SteamHTMLSurface() ) + m_SteamAPIContext.SteamHTMLSurface()->MouseMove( m_unBrowserHandle, x, y ); + } + +protected: + virtual void ApplySchemeSettings( IScheme *pScheme ); + + vgui::Menu *m_pContextMenu; + +private: + STEAM_CALLBACK( HTML, BrowserNeedsPaint, HTML_NeedsPaint_t, m_NeedsPaint ); + STEAM_CALLBACK( HTML, BrowserStartRequest, HTML_StartRequest_t, m_StartRequest ); + STEAM_CALLBACK( HTML, BrowserURLChanged, HTML_URLChanged_t, m_URLChanged ); + STEAM_CALLBACK( HTML, BrowserFinishedRequest, HTML_FinishedRequest_t, m_FinishedRequest ); + STEAM_CALLBACK( HTML, BrowserOpenNewTab, HTML_OpenLinkInNewTab_t, m_LinkInNewTab ); + STEAM_CALLBACK( HTML, BrowserSetHTMLTitle, HTML_ChangedTitle_t, m_ChangeTitle ); + STEAM_CALLBACK( HTML, BrowserPopupHTMLWindow, HTML_NewWindow_t, m_NewWindow ); + STEAM_CALLBACK( HTML, BrowserFileLoadDialog, HTML_FileOpenDialog_t, m_FileLoadDialog ); + STEAM_CALLBACK( HTML, BrowserSearchResults, HTML_SearchResults_t, m_SearchResults ); + STEAM_CALLBACK( HTML, BrowserClose, HTML_CloseBrowser_t, m_CloseBrowser ); + STEAM_CALLBACK( HTML, BrowserHorizontalScrollBarSizeResponse, HTML_HorizontalScroll_t, m_HorizScroll ); + STEAM_CALLBACK( HTML, BrowserVerticalScrollBarSizeResponse, HTML_VerticalScroll_t, m_VertScroll ); + STEAM_CALLBACK( HTML, BrowserLinkAtPositionResponse, HTML_LinkAtPosition_t, m_LinkAtPosResp ); + STEAM_CALLBACK( HTML, BrowserJSAlert, HTML_JSAlert_t, m_JSAlert ); + STEAM_CALLBACK( HTML, BrowserJSConfirm, HTML_JSConfirm_t, m_JSConfirm ); + STEAM_CALLBACK( HTML, BrowserCanGoBackandForward, HTML_CanGoBackAndForward_t, m_CanGoBackForward ); + STEAM_CALLBACK( HTML, BrowserSetCursor, HTML_SetCursor_t, m_SetCursor ); + STEAM_CALLBACK( HTML, BrowserStatusText, HTML_StatusText_t, m_StatusText ); + STEAM_CALLBACK( HTML, BrowserShowToolTip, HTML_ShowToolTip_t, m_ShowTooltip ); + STEAM_CALLBACK( HTML, BrowserUpdateToolTip, HTML_UpdateToolTip_t, m_UpdateTooltip ); + STEAM_CALLBACK( HTML, BrowserHideToolTip, HTML_HideToolTip_t, m_HideTooltip ); + + void OnBrowserReady( HTML_BrowserReady_t *pBrowserReady, bool bIOFailure ); + + void PostURL(const char *URL, const char *pchPostData, bool force); + virtual void BrowserResize(); + void UpdateSizeAndScrollBars(); + MESSAGE_FUNC( OnSliderMoved, "ScrollBarSliderMoved" ); + MESSAGE_FUNC_CHARPTR( OnFileSelected, "FileSelected", fullpath ); + MESSAGE_FUNC( OnFileSelectionCancelled, "FileSelectionCancelled" ); + MESSAGE_FUNC_PTR( OnTextChanged, "TextChanged", panel ); + MESSAGE_FUNC_PTR( OnEditNewLine, "TextNewLine", panel ); + MESSAGE_FUNC_INT( DismissJSDialog, "DismissJSDialog", result ); + + vgui::Panel *m_pInteriorPanel; + vgui::ScrollBar *_hbar,*_vbar; + vgui::DHANDLE<vgui::FileOpenDialog> m_hFileOpenDialog; + class CHTMLFindBar : public vgui::EditablePanel + { + DECLARE_CLASS_SIMPLE( CHTMLFindBar, EditablePanel ); + public: + CHTMLFindBar( HTML *parent ); + void SetText( const char *pchText ) { m_pFindBar->SetText( pchText ); } + void GetText( char *pText, int ccText ) { m_pFindBar->GetText( pText, ccText ); } + void OnCommand( const char *pchCmd ); + void ShowCountLabel() { m_pFindCountLabel->SetVisible( true ); } + void HideCountLabel() { m_pFindCountLabel->SetVisible( false ); } + void SetHidden( bool bState ) { m_bHidden = bState; } + bool BIsHidden() { return m_bHidden; } + + private: + vgui::TextEntry *m_pFindBar; + vgui::HTML *m_pParent; + vgui::Label *m_pFindCountLabel; + bool m_bHidden; + }; + + CHTMLFindBar *m_pFindBar; + + int m_iMouseX,m_iMouseY; // where the mouse is on the control + + int m_iScrollBorderX,m_iScrollBorderY; + int m_iWideLastHTMLSize, m_iTalLastHTMLSize; + int m_iCopyLinkMenuItemID; + + bool m_bScrollBarEnabled; + bool m_bContextMenuEnabled; + int m_iScrollbarSize; + bool m_bNewWindowsOnly; + int m_nViewSourceAllowedIndex; + CUtlString m_sDragURL; + int m_iDragStartX, m_iDragStartY; + + struct CustomURLHandler_t + { + PHandle hPanel; + char url[32]; + }; + CUtlVector<CustomURLHandler_t> m_CustomURLHandlers; + + int m_iHTMLTextureID; // vgui texture id + // Track the texture width and height requested so we can tell + // when the size has changed and reallocate the texture. + int m_allocedTextureWidth; + int m_allocedTextureHeight; + bool m_bNeedsFullTextureUpload; + CUtlString m_sCurrentURL; // the url of our current page + // find in page state + bool m_bInFind; + CUtlString m_sLastSearchString; + + bool m_bCanGoBack; // cache of forward and back state + bool m_bCanGoForward; + + struct LinkAtPos_t + { + LinkAtPos_t() { m_nX = m_nY = 0; } + uint32 m_nX; + uint32 m_nY; + CUtlString m_sURL; + }; + LinkAtPos_t m_LinkAtPos; // cache for link at pos requests, because the request is async + bool m_bRequestingDragURL; // true if we need a response for a drag url loc + bool m_bRequestingCopyLink; // true if we wanted to copy the link under the cursor + + struct ScrollData_t + { + ScrollData_t() + { + m_bVisible = false; + m_nMax = m_nScroll = 0; + } + + bool operator==( ScrollData_t const &src ) const + { + return m_bVisible == src.m_bVisible && + m_nMax == src.m_nMax && + m_nScroll == src.m_nScroll; + } + + bool operator!=( ScrollData_t const &src ) const + { + return !operator==(src); + } + + + bool m_bVisible; // is the scroll bar visible + int m_nMax; // most amount of pixels we can scroll + int m_nScroll; // currently scrolled amount of pixels + float m_flZoom; // zoom level this scroll bar is for + }; + + ScrollData_t m_scrollHorizontal; // details of horizontal scroll bar + ScrollData_t m_scrollVertical; // details of vertical scroll bar + float m_flZoom; // current page zoom level + + CUtlString m_sPendingURLLoad; // cache of url to load if we get a PostURL before the cef object is mage + CUtlString m_sPendingPostData; // cache of the post data for above + + struct CustomCursorCache_t + { + CustomCursorCache_t() {} + CustomCursorCache_t( const void *pchData ) { m_pchData = pchData; } + float m_CacheTime; // the time we cached the cursor + CursorCode m_Cursor; // the vgui handle to it + const void *m_pchData; // the pointer to the cursor char data so we can detect the same cursor being used + bool operator==(const CustomCursorCache_t& rhs) const + { + return m_pchData == rhs.m_pchData ; + } + }; + CUtlVector<CustomCursorCache_t> m_vecHCursor; + + CSteamAPIContext m_SteamAPIContext; + HHTMLBrowser m_unBrowserHandle; + CCallResult< HTML, HTML_BrowserReady_t > m_SteamCallResultBrowserReady; +}; + +} // namespace vgui + +#endif // HTML_H diff --git a/public/vgui_controls/Image.h b/public/vgui_controls/Image.h new file mode 100644 index 0000000..9ed128e --- /dev/null +++ b/public/vgui_controls/Image.h @@ -0,0 +1,80 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef IMAGE_H +#define IMAGE_H + +#ifdef _WIN32 +#pragma once +#endif + +#include <vgui/VGUI.h> +#include <Color.h> +#include <vgui/IImage.h> + +namespace vgui +{ + +class Panel; + +//----------------------------------------------------------------------------- +// Purpose: Basic image control +//----------------------------------------------------------------------------- +class Image : public IImage +{ +public: + Image(); + virtual ~Image(); + + // Set the position of the image + virtual void SetPos( int x, int y ); + // Get the position of the image + virtual void GetPos( int &x, int &y ); + // Get the size of the image + virtual void GetSize( int &wide, int &tall ); + virtual void GetContentSize( int &wide, int &tall ); + // Set the draw color + virtual void SetColor( Color color ); + // set the background color + virtual void SetBkColor( Color color ) { DrawSetColor( color ); } + // Get the draw color + virtual Color GetColor(); + virtual bool Evict(); + virtual int GetNumFrames(); + virtual void SetFrame( int nFrame ); + virtual HTexture GetID(); + virtual void SetRotation( int iRotation ) { return; }; + +protected: + virtual void SetSize(int wide, int tall); + virtual void DrawSetColor(Color color); + virtual void DrawSetColor(int r, int g, int b, int a); + virtual void DrawFilledRect(int x0, int y0, int x1, int y1); + virtual void DrawOutlinedRect(int x0, int y0, int x1, int y1); + virtual void DrawLine(int x0,int y0,int x1,int y1); + virtual void DrawPolyLine(int *px, int *py, int numPoints); + virtual void DrawSetTextFont(HFont font); + virtual void DrawSetTextColor(Color color); + virtual void DrawSetTextColor(int r, int g, int b, int a); + virtual void DrawSetTextPos(int x,int y); + virtual void DrawPrintText(const wchar_t *str, int strlen); + virtual void DrawPrintText(int x, int y, const wchar_t *str, int strlen); + virtual void DrawPrintChar(wchar_t ch); + virtual void DrawPrintChar(int x, int y, wchar_t ch); + virtual void DrawSetTexture(int id); + virtual void DrawTexturedRect(int x0, int y0, int x1, int y1); + virtual void Paint() = 0; + +private: + int _pos[2]; + int _size[2]; + Color _color; +}; + +} // namespace vgui + +#endif // IMAGE_H diff --git a/public/vgui_controls/ImageList.h b/public/vgui_controls/ImageList.h new file mode 100644 index 0000000..db9ec63 --- /dev/null +++ b/public/vgui_controls/ImageList.h @@ -0,0 +1,56 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef IMAGELIST_H +#define IMAGELIST_H + +#ifdef _WIN32 +#pragma once +#endif + +#include <utlvector.h> +#include <vgui/VGUI.h> +#include <vgui/IImage.h> + +namespace vgui +{ + +//----------------------------------------------------------------------------- +// Purpose: holds a collection of images +// used by controls so that images can be refered to by indices +//----------------------------------------------------------------------------- +class ImageList +{ +public: + ImageList(bool deleteImagesWhenDone); + ~ImageList(); + + // adds a new image to the list, returning the index it was placed at + int AddImage(vgui::IImage *image); + + // returns the number of images + int GetImageCount(); + + // returns true if an index is valid + bool IsValidIndex(int imageIndex); + + // sets an image at a specified index, growing and adding NULL images if necessary + void SetImageAtIndex(int index, vgui::IImage *image); + + // gets an image, imageIndex is of range [0, GetImageCount) + // image index 0 is always the blank image + vgui::IImage *GetImage(int imageIndex); + +private: + CUtlVector<vgui::IImage *> m_Images; + bool m_bDeleteImagesWhenDone; +}; + + +} // namespace vgui + +#endif // IMAGELIST_H diff --git a/public/vgui_controls/ImagePanel.h b/public/vgui_controls/ImagePanel.h new file mode 100644 index 0000000..bba8f88 --- /dev/null +++ b/public/vgui_controls/ImagePanel.h @@ -0,0 +1,92 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef IMAGEPANEL_H +#define IMAGEPANEL_H + +#ifdef _WIN32 +#pragma once +#endif + +#include <vgui/VGUI.h> +#include <vgui_controls/Panel.h> + +namespace vgui +{ + +class IImage; + +//----------------------------------------------------------------------------- +// Purpose: Panel that holds a single image +//----------------------------------------------------------------------------- +class ImagePanel : public Panel +{ + DECLARE_CLASS_SIMPLE( ImagePanel, Panel ); +public: + ImagePanel(Panel *parent, const char *name); + ~ImagePanel(); + + virtual void SetImage(IImage *image); + virtual void SetImage(const char *imageName); + virtual IImage *GetImage(); + char *GetImageName(); + + void SetShouldCenterImage( bool state ) { m_bCenterImage = state; } + bool GetShouldCenterImage() const { return m_bCenterImage; } + + // sets whether or not the image should scale to fit the size of the ImagePanel (defaults to false) + void SetShouldScaleImage( bool state ); + bool GetShouldScaleImage(); + void SetScaleAmount( float scale ); + float GetScaleAmount( void ); + + void SetTileImage( bool bTile ) { m_bTileImage = bTile; } + + // set the color to fill with, if no image is specified + void SetFillColor( Color col ); + Color GetFillColor(); + + virtual Color GetDrawColor( void ); + virtual void SetDrawColor( Color drawColor ); + + virtual void ApplySettings(KeyValues *inResourceData); + + // unhooks and evicts image if possible, caller must re-establish + bool EvictImage(); + + int GetNumFrames(); + void SetFrame( int nFrame ); + + void SetRotation( int iRotation ) { m_iRotation = iRotation; } + +protected: + virtual void PaintBackground(); + virtual void GetSettings(KeyValues *outResourceData); + virtual const char *GetDescription(); + virtual void OnSizeChanged(int newWide, int newTall); + virtual void ApplySchemeSettings( IScheme *pScheme ); + +private: + IImage *m_pImage; + char *m_pszImageName; + char *m_pszFillColorName; + char *m_pszDrawColorName; + bool m_bPositionImage; + bool m_bCenterImage; + bool m_bScaleImage; + bool m_bTileImage; + bool m_bTileHorizontally; + bool m_bTileVertically; + float m_fScaleAmount; + Color m_FillColor; + Color m_DrawColor; + int m_iRotation; +}; + +} // namespace vgui + +#endif // IMAGEPANEL_H diff --git a/public/vgui_controls/InputDialog.h b/public/vgui_controls/InputDialog.h new file mode 100644 index 0000000..00b8d6f --- /dev/null +++ b/public/vgui_controls/InputDialog.h @@ -0,0 +1,106 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//=============================================================================// + +#ifndef INPUTDIALOG_H +#define INPUTDIALOG_H +#ifdef _WIN32 +#pragma once +#endif + +#include <vgui_controls/Controls.h> +#include <vgui_controls/Frame.h> + +namespace vgui +{ + +class Label; +class Button; +class TextEntry; + + +//----------------------------------------------------------------------------- +// Purpose: Utility dialog base class - just has context kv and ok/cancel buttons +//----------------------------------------------------------------------------- +class BaseInputDialog : public Frame +{ + DECLARE_CLASS_SIMPLE( BaseInputDialog, Frame ); + +public: + BaseInputDialog( vgui::Panel *parent, const char *title ); + ~BaseInputDialog(); + + void DoModal( KeyValues *pContextKeyValues = NULL ); + +protected: + virtual void PerformLayout(); + virtual void PerformLayout( int x, int y, int w, int h ) {} + + // command buttons + virtual void OnCommand( const char *command ); + + void CleanUpContextKeyValues(); + KeyValues *m_pContextKeyValues; + +private: + vgui::Button *m_pCancelButton; + vgui::Button *m_pOKButton; +}; + +//----------------------------------------------------------------------------- +// Purpose: Utility dialog, used to ask yes/no questions of the user +//----------------------------------------------------------------------------- +class InputMessageBox : public BaseInputDialog +{ + DECLARE_CLASS_SIMPLE( InputMessageBox, BaseInputDialog ); + +public: + InputMessageBox( vgui::Panel *parent, const char *title, char const *prompt ); + ~InputMessageBox(); + +protected: + virtual void PerformLayout( int x, int y, int w, int h ); + +private: + vgui::Label *m_pPrompt; +}; + +//----------------------------------------------------------------------------- +// Purpose: Utility dialog, used to let user type in some text +//----------------------------------------------------------------------------- +class InputDialog : public BaseInputDialog +{ + DECLARE_CLASS_SIMPLE( InputDialog, BaseInputDialog ); + +public: + InputDialog( vgui::Panel *parent, const char *title, char const *prompt, char const *defaultValue = "" ); + ~InputDialog(); + + void SetMultiline( bool state ); + + /* action signals + + "InputCompleted" + "text" - the text entered + + "InputCanceled" + */ + void AllowNumericInputOnly( bool bOnlyNumeric ); + +protected: + virtual void PerformLayout( int x, int y, int w, int h ); + + // command buttons + virtual void OnCommand(const char *command); + +private: + vgui::Label *m_pPrompt; + vgui::TextEntry *m_pInput; +}; + +} // namespace vgui + + +#endif // INPUTDIALOG_H diff --git a/public/vgui_controls/KeyBindingHelpDialog.h b/public/vgui_controls/KeyBindingHelpDialog.h new file mode 100644 index 0000000..3e4d0ed --- /dev/null +++ b/public/vgui_controls/KeyBindingHelpDialog.h @@ -0,0 +1,63 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//============================================================================= + +#ifndef KEYBINDINGHELPDIALOG_H +#define KEYBINDINGHELPDIALOG_H +#ifdef _WIN32 +#pragma once +#endif + +#include "vgui_controls/Frame.h" +#include "vgui/KeyCode.h" + +namespace vgui +{ + +class ListPanel; +class CKeyBoardEditorDialog; + +//----------------------------------------------------------------------------- +// Purpose: Dialog for use in editing keybindings +//----------------------------------------------------------------------------- +class CKeyBindingHelpDialog : public Frame +{ + DECLARE_CLASS_SIMPLE( CKeyBindingHelpDialog, Frame ); + +public: + CKeyBindingHelpDialog( Panel *parent, Panel *panelToView, KeyBindingContextHandle_t handle, KeyCode code, int modifiers ); + ~CKeyBindingHelpDialog(); + + virtual void OnCommand( char const *cmd ); + virtual void OnKeyCodeTyped(vgui::KeyCode code); + + // The key originally bound to help was pressed + void HelpKeyPressed(); +private: + + virtual void OnTick(); + + bool IsHelpKeyStillBeingHeld(); + + void PopulateList(); + void GetMappingList( Panel *panel, CUtlVector< PanelKeyBindingMap * >& maps ); + + void AnsiText( char const *token, char *out, size_t buflen ); + + vgui::PHandle m_hPanel; + KeyBindingContextHandle_t m_Handle; + KeyCode m_KeyCode; + int m_Modifiers; + + ListPanel *m_pList; + double m_flShowTime; + bool m_bPermanent; + + DHANDLE< CKeyBoardEditorDialog > m_hKeyBindingsEditor; +}; + +} + +#endif // KEYBINDINGHELPDIALOG_H diff --git a/public/vgui_controls/KeyBindingMap.h b/public/vgui_controls/KeyBindingMap.h new file mode 100644 index 0000000..16641c7 --- /dev/null +++ b/public/vgui_controls/KeyBindingMap.h @@ -0,0 +1,225 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//============================================================================= + +#ifndef KEYBINDINGMAP_H +#define KEYBINDINGMAP_H +#ifdef _WIN32 +#pragma once +#endif + +#include "tier1/utlvector.h" + +// more flexible than default pointers to members code required for casting member function pointers +//#pragma pointers_to_members( full_generality, virtual_inheritance ) + +namespace vgui +{ + +class Panel; + +enum +{ + MODIFIER_SHIFT = ( 1 << 0 ), + MODIFIER_CONTROL = ( 1 << 1 ), + MODIFIER_ALT = ( 1 << 2 ), +}; + +//----------------------------------------------------------------------------- +// Purpose: An actual keybinding, where bindingname references a bindingmap mentioned below +//----------------------------------------------------------------------------- +struct BoundKey_t +{ + BoundKey_t(); + BoundKey_t( const BoundKey_t& src ); + ~BoundKey_t(); + BoundKey_t& operator =( const BoundKey_t& src ); + + bool isbuiltin; // whether this was by the #DECLARE macros or via code/parsing a config file + char const *bindingname; // what it's bound to + int keycode; // vgui keycode + int modifiers; // which modifiers +}; + +//----------------------------------------------------------------------------- +// Purpose: Single item in a message map +// Contains the information to map a string message name with parameters +// to a function call +//----------------------------------------------------------------------------- +struct KeyBindingMap_t +{ + KeyBindingMap_t(); + KeyBindingMap_t( const KeyBindingMap_t& src ); + ~KeyBindingMap_t(); + + char const *bindingname; // for the script file + ALIGN16 MessageFunc_t func; + char const *helpstring; // e.g., #KeybindingPasteHelp + char const *docstring; // e.g., #KeybindingPasteHelp + bool passive; // dispatch command, but still chain +}; + +#define DECLARE_KEYBINDINGMAP( className ) \ + static void KB_AddToMap \ + ( \ + char const *bindingname, \ + vgui::KeyCode defaultcode, \ + int default_modifiers, \ + vgui::MessageFunc_t function, \ + char const *helpstring, \ + char const *docstring, \ + bool passive \ + ) \ + { \ + vgui::PanelKeyBindingMap *map = vgui::FindOrAddPanelKeyBindingMap( GetPanelClassName() ); \ + \ + vgui::KeyBindingMap_t entry; \ + entry.bindingname = bindingname; \ + \ + entry.func = function; \ + \ + entry.helpstring = helpstring; \ + entry.docstring = docstring; \ + \ + entry.passive = passive; \ + \ + map->entries.AddToTail( entry ); \ + \ + vgui::BoundKey_t kb; \ + kb.isbuiltin = true; \ + kb.bindingname = bindingname; \ + kb.keycode = defaultcode; \ + kb.modifiers = default_modifiers; \ + map->defaultkeys.AddToTail( kb ); \ + map->boundkeys.AddToTail( kb ); \ + } \ + \ + static void KB_ChainToMap( void ) \ + { \ + static bool chained = false; \ + if ( chained ) \ + return; \ + chained = true; \ + vgui::PanelKeyBindingMap *map = vgui::FindOrAddPanelKeyBindingMap( GetPanelClassName() ); \ + map->pfnClassName = &GetPanelClassName; \ + if ( map && GetPanelBaseClassName() && GetPanelBaseClassName()[0] ) \ + { \ + map->baseMap = vgui::FindOrAddPanelKeyBindingMap( GetPanelBaseClassName() ); \ + } \ + } \ + \ + static void KB_AddBoundKey \ + ( \ + char const *bindingname, \ + int keycode, \ + int modifiers \ + ) \ + { \ + vgui::PanelKeyBindingMap *map = vgui::FindOrAddPanelKeyBindingMap( GetPanelClassName() ); \ + vgui::BoundKey_t kb; \ + kb.isbuiltin = true; \ + kb.bindingname = bindingname; \ + kb.keycode = keycode; \ + kb.modifiers = modifiers; \ + map->defaultkeys.AddToTail( kb ); \ + map->boundkeys.AddToTail( kb ); \ + } \ + \ + class className##_RegisterKBMap; \ + friend class className##_RegisterKBMap; \ + class className##_RegisterKBMap \ + { \ + public: \ + className##_RegisterKBMap() \ + { \ + className::KB_ChainToMap(); \ + } \ + }; \ + className##_RegisterKBMap m_RegisterClassKB; \ + \ + virtual vgui::PanelKeyBindingMap *GetKBMap() \ + { \ + static vgui::PanelKeyBindingMap *s_pMap = vgui::FindOrAddPanelKeyBindingMap( GetPanelClassName() ); \ + return s_pMap; \ + } + +#define _KBMapFuncCommonFunc( name, keycode, modifiers, function, help, doc, passive ) \ + class PanelKBMapFunc_##name; \ + friend class PanelKBMapFunc_##name; \ + class PanelKBMapFunc_##name \ + { \ + public: \ + static void InitVar() \ + { \ + static bool bAdded = false; \ + if ( !bAdded ) \ + { \ + bAdded = true; \ + KB_AddToMap( #name, keycode, modifiers, (vgui::MessageFunc_t)&ThisClass::function, help, doc, passive ); \ + } \ + } \ + PanelKBMapFunc_##name() \ + { \ + PanelKBMapFunc_##name::InitVar(); \ + } \ + }; \ + PanelKBMapFunc_##name m_##name##_register; + +#define _KBBindKeyCommon( name, keycode, modifiers, _classname ) \ + class PanelKBBindFunc_##_classname; \ + friend class PanelKBBindFunc_##_classname; \ + class PanelKBBindFunc_##_classname \ + { \ + public: \ + static void InitVar() \ + { \ + static bool bAdded = false; \ + if ( !bAdded ) \ + { \ + bAdded = true; \ + KB_AddBoundKey( #name, keycode, modifiers ); \ + } \ + } \ + PanelKBBindFunc_##_classname() \ + { \ + PanelKBBindFunc_##_classname::InitVar(); \ + } \ + }; \ + PanelKBBindFunc_##_classname m_##_classname##_bindkey_register; + +#define KEYBINDING_FUNC( name, keycode, modifiers, function, help, doc ) _KBMapFuncCommonFunc( name, keycode, modifiers, function, help, doc, false ); virtual void function() +#define KEYBINDING_FUNC_NODECLARE( name, keycode, modifiers, function, help, doc ) _KBMapFuncCommonFunc( name, keycode, modifiers, function, help, doc, false ); +#define KEYBINDING_FUNC_PASSIVE( name, keycode, modifiers, function, help, doc ) _KBMapFuncCommonFunc( name, keycode, modifiers, function, help, doc, true ); virtual void function() +#define KEYBINDING_FUNC_PASSIVE_NODECLARE( name, keycode, modifiers, function, help, doc ) _KBMapFuncCommonFunc( name, keycode, modifiers, function, help, doc, true ); + +// For definding additional (non-default) keybindings +#define KEYBINDING_ADDBINDING( name, keycode, modifiers ) _KBBindKeyCommon( name, keycode, modifiers, name ); +#define KEYBINDING_ADDBINDING_MULTIPLE( name, keycode, modifiers, _classname ) _KBBindKeyCommon( name, keycode, modifiers, _classname ); + +// mapping, one per class +struct PanelKeyBindingMap +{ + PanelKeyBindingMap() + { + baseMap = NULL; + pfnClassName = NULL; + processed = false; + } + + CUtlVector< KeyBindingMap_t > entries; + bool processed; + PanelKeyBindingMap *baseMap; + CUtlVector< BoundKey_t > defaultkeys; + CUtlVector< BoundKey_t > boundkeys; + char const *(*pfnClassName)( void ); +}; + +PanelKeyBindingMap *FindPanelKeyBindingMap( char const *className ); +PanelKeyBindingMap *FindOrAddPanelKeyBindingMap( char const *className ); + +} // namespace vgui + + +#endif // KEYBINDINGMAP_H diff --git a/public/vgui_controls/KeyBoardEditorDialog.h b/public/vgui_controls/KeyBoardEditorDialog.h new file mode 100644 index 0000000..209c86f --- /dev/null +++ b/public/vgui_controls/KeyBoardEditorDialog.h @@ -0,0 +1,138 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//============================================================================= + +#ifndef KEYBOARDEDITORDIALOG_H +#define KEYBOARDEDITORDIALOG_H +#ifdef _WIN32 +#pragma once +#endif + +#include "vgui_controls/Frame.h" +#include "vgui_controls/PropertySheet.h" +#include "vgui_controls/PropertyPage.h" + +class VControlsListPanel; + +namespace vgui +{ + +//----------------------------------------------------------------------------- +// Purpose: Dialog for use in editing keybindings +//----------------------------------------------------------------------------- +class CKeyBoardEditorPage : public EditablePanel +{ + DECLARE_CLASS_SIMPLE( CKeyBoardEditorPage, EditablePanel ); + +public: + CKeyBoardEditorPage( Panel *parent, Panel *panelToEdit, KeyBindingContextHandle_t handle ); + ~CKeyBoardEditorPage(); + + void SetKeybindingsSaveFile( char const *filename, char const *pathID = 0 ); + + virtual void OnKeyCodeTyped(vgui::KeyCode code); + + virtual void ApplySchemeSettings( IScheme *scheme ); + + void OnSaveChanges(); + void OnRevert(); + void OnUseDefaults(); + +protected: + + virtual void OnPageHide(); + + virtual void OnCommand( char const *cmd ); + + void PopulateList(); + + void GetMappingList( Panel *panel, CUtlVector< PanelKeyBindingMap * >& maps ); + int GetMappingCount( Panel *panel ); + + void BindKey( vgui::KeyCode code ); + + // Trap row selection message + MESSAGE_FUNC( ItemSelected, "ItemSelected" ); + MESSAGE_FUNC_INT( OnClearBinding, "ClearBinding", item ); + + void SaveMappings(); + void UpdateCurrentMappings(); + void RestoreMappings(); + void ApplyMappings(); + +protected: + void AnsiText( char const *token, char *out, size_t buflen ); + + Panel *m_pPanel; + KeyBindingContextHandle_t m_Handle; + + VControlsListPanel *m_pList; + + struct SaveMapping_t + { + SaveMapping_t(); + SaveMapping_t( const SaveMapping_t& src ); + + PanelKeyBindingMap *map; + CUtlVector< BoundKey_t > current; + CUtlVector< BoundKey_t > original; + }; + + CUtlVector< SaveMapping_t * > m_Save; +}; + + +//----------------------------------------------------------------------------- +// Purpose: Dialog for use in editing keybindings +//----------------------------------------------------------------------------- +class CKeyBoardEditorSheet : public PropertySheet +{ + DECLARE_CLASS_SIMPLE( CKeyBoardEditorSheet, PropertySheet ); + +public: + CKeyBoardEditorSheet( Panel *parent, Panel *panelToEdit, KeyBindingContextHandle_t handle ); + + void SetKeybindingsSaveFile( char const *filename, char const *pathID = 0 ); + + void OnSaveChanges(); + void OnRevert(); + void OnUseDefaults(); + +protected: + + vgui::PHandle m_hPanel; + KeyBindingContextHandle_t m_Handle; + bool m_bSaveToExternalFile; + CUtlSymbol m_SaveFileName; + CUtlSymbol m_SaveFilePathID; + Color m_clrAlteredItem; +}; + +//----------------------------------------------------------------------------- +// Purpose: Dialog for use in editing keybindings +//----------------------------------------------------------------------------- +class CKeyBoardEditorDialog : public Frame +{ + DECLARE_CLASS_SIMPLE( CKeyBoardEditorDialog, Frame ); + +public: + CKeyBoardEditorDialog( Panel *parent, Panel *panelToEdit, KeyBindingContextHandle_t handle ); + + void SetKeybindingsSaveFile( char const *filename, char const *pathID = 0 ); + + virtual void OnCommand( char const *cmd ); + +private: + CKeyBoardEditorSheet *m_pKBEditor; + + Button *m_pSave; + Button *m_pCancel; + Button *m_pRevert; + Button *m_pUseDefaults; +}; + +} + +#endif // KEYBOARDEDITORDIALOG_H diff --git a/public/vgui_controls/KeyRepeat.h b/public/vgui_controls/KeyRepeat.h new file mode 100644 index 0000000..83d30a3 --- /dev/null +++ b/public/vgui_controls/KeyRepeat.h @@ -0,0 +1,79 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//============================================================================= + +#ifndef KEYREPEAT_H +#define KEYREPEAT_H +#ifdef _WIN32 +#pragma once +#endif + +#include <vgui_controls/Panel.h> + +namespace vgui +{ + +enum KEYREPEAT_ALIASES +{ + KR_ALIAS_UP, + KR_ALIAS_DOWN, + KR_ALIAS_LEFT, + KR_ALIAS_RIGHT, + + FM_NUM_KEYREPEAT_ALIASES, +}; + +class CKeyRepeatHandler +{ +public: + CKeyRepeatHandler() + { + Reset(); + for ( int i = 0; i < FM_NUM_KEYREPEAT_ALIASES; i++ ) + { + m_flRepeatTimes[i] = 0.16; + } + } + + void Reset( void ) { memset( m_bAliasDown, 0, sizeof(bool) * FM_NUM_KEYREPEAT_ALIASES ); m_bHaveKeyDown = false; } + void KeyDown( vgui::KeyCode code ); + void KeyUp( vgui::KeyCode code ); + vgui::KeyCode KeyRepeated( void ); + void SetKeyRepeatTime( vgui::KeyCode code, float flRepeat ); + +private: + int GetIndexForCode( vgui::KeyCode code ) + { + switch ( code ) + { + case KEY_XBUTTON_DOWN: + case KEY_XSTICK1_DOWN: + return KR_ALIAS_DOWN; break; + case KEY_XBUTTON_UP: + case KEY_XSTICK1_UP: + return KR_ALIAS_UP; break; + case KEY_XBUTTON_LEFT: + case KEY_XSTICK1_LEFT: + return KR_ALIAS_LEFT; break; + case KEY_XBUTTON_RIGHT: + case KEY_XSTICK1_RIGHT: + return KR_ALIAS_RIGHT; break; + default: + break; + } + return -1; + } + +private: + bool m_bAliasDown[FM_NUM_KEYREPEAT_ALIASES]; + float m_flRepeatTimes[FM_NUM_KEYREPEAT_ALIASES]; + float m_flNextKeyRepeat; + bool m_bHaveKeyDown; +}; + + +} // namespace vgui + +#endif // KEYREPEAT_H diff --git a/public/vgui_controls/Label.h b/public/vgui_controls/Label.h new file mode 100644 index 0000000..53422f7 --- /dev/null +++ b/public/vgui_controls/Label.h @@ -0,0 +1,225 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef LABEL_H +#define LABEL_H + +#ifdef _WIN32 +#pragma once +#endif + +#include "utlvector.h" +#include "vgui/VGUI.h" +#include "vgui_controls/Panel.h" +#include "vgui_controls/PHandle.h" + +namespace vgui +{ + +//----------------------------------------------------------------------------- +// Purpose: Contains and displays a set of images +// By default starts with one TextImage +//----------------------------------------------------------------------------- +class Label : public Panel +{ + DECLARE_CLASS_SIMPLE( Label, Panel ); + +public: + // Constructors + Label(Panel *parent, const char *panelName, const char *text); + Label(Panel *parent, const char *panelName, const wchar_t *wszText); + ~Label(); + +public: + // Take the string and looks it up in the localization file to convert it to unicode + virtual void SetText(const char *tokenName); + + // Set unicode text directly + virtual void SetText(const wchar_t *unicodeString, bool bClearUnlocalizedSymbol = false ); + + // Get the current text + virtual void GetText(OUT_Z_BYTECAP(bufferLen) char *textOut, int bufferLen); + virtual void GetText(OUT_Z_BYTECAP(bufLenInBytes) wchar_t *textOut, int bufLenInBytes); + + // Content alignment + // Get the size of the content within the label + virtual void GetContentSize(int &wide, int &tall); + + // Set how the content aligns itself within the label + // alignment code, used to determine how the images are layed out within the Label + enum Alignment + { + a_northwest = 0, + a_north, + a_northeast, + a_west, + a_center, + a_east, + a_southwest, + a_south, + a_southeast, + }; + + virtual void SetContentAlignment(Alignment alignment); + virtual void SetEnabled(bool state); + // Additional offset at the Start of the text (from whichever sides it is aligned) + virtual void SetTextInset(int xInset, int yInset); + virtual void GetTextInset(int *xInset, int *yInset ); + + // Text colors + virtual void SetFgColor(Color color); + virtual Color GetFgColor(); + + // colors to use when the label is disabled + virtual void SetDisabledFgColor1(Color color); + virtual void SetDisabledFgColor2(Color color); + virtual Color GetDisabledFgColor1(); + virtual Color GetDisabledFgColor2(); + + // Set whether the text is displayed bright or dull + enum EColorState + { + CS_NORMAL, + CS_DULL, + CS_BRIGHT, + }; + virtual void SetTextColorState(EColorState state); + + // Font + virtual void SetFont(HFont font); + virtual HFont GetFont(); + + // Hotkey + virtual Panel *HasHotkey(wchar_t key); + virtual void SetHotkey(wchar_t key); + virtual wchar_t GetHotKey(); + + // Labels can be associated with controls, and alter behaviour based on the associates behaviour + // If the associate is disabled, so are we + // If the associate has focus, we may alter how we draw + // If we get a hotkey press or focus message, we forward the focus to the associate + virtual void SetAssociatedControl(Panel *control); + + // Multiple image handling + // Images are drawn from left to right across the label, ordered by index + // By default there is a TextImage in position 0 (see GetTextImage()/SetTextImageIndex()) + virtual int AddImage(IImage *image, int preOffset); // Return the index the image was placed in + virtual void SetImageAtIndex(int index, IImage *image, int preOffset); + virtual void SetImagePreOffset(int index, int preOffset); // Set the offset in pixels before the image + virtual IImage *GetImageAtIndex(int index); + virtual int GetImageCount(); + virtual void ClearImages(); + virtual void ResetToSimpleTextImage(); + // fixes the layout bounds of the image within the label + virtual void SetImageBounds(int index, int x, int width); + + // Teturns a pointer to the default text image + virtual TextImage *GetTextImage(); + + // Moves where the default text image is within the image array (it starts in position 0) + // Setting it to -1 removes it from the image list + // Returns the index the default text image was previously in + virtual int SetTextImageIndex(int newIndex); + + // Message handling + // outputData - keyName is the name of the attribute requested. + // for Labels "text" is an option that returns the default text image text + // returns true on success in finding the requested value. false on failure. + virtual bool RequestInfo(KeyValues *outputData); + /* INFO HANDLING + "GetText" + returns: + "text" - text contained in the label + */ + + /* CUSTOM MESSAGE HANDLING + "SetText" + input: "text" - label text is set to be this string + */ + + virtual void SizeToContents(); + + // the +8 is padding to the content size + // the code which uses it should really set that itself; + // however a lot of existing code relies on this + enum Padding + { + Content = 8, + }; + + void SetWrap( bool bWrap ); + void SetCenterWrap( bool bWrap ); + + void SetAllCaps( bool bAllCaps ); + +protected: + virtual void PerformLayout(); + virtual wchar_t CalculateHotkey(const char *text); + virtual wchar_t CalculateHotkey(const wchar_t *text); + virtual void ComputeAlignment(int &tx0, int &ty0, int &tx1, int &ty1); + virtual void Paint(); + MESSAGE_FUNC_PARAMS( OnSetText, "SetText", params ); + virtual void DrawDashedLine(int x0, int y0, int x1, int y1, int dashLen, int gapLen); + virtual void OnRequestFocus(VPANEL subFocus, VPANEL defaultPanel); + MESSAGE_FUNC( OnHotkeyPressed, "Hotkey" ); + virtual void OnMousePressed(MouseCode code); + virtual void OnSizeChanged(int wide, int tall); + + // makes sure that the maxIndex will be a valid index + virtual void EnsureImageCapacity(int maxIndex); + + // editing + virtual void ApplySchemeSettings(IScheme *pScheme); + virtual void GetSettings( KeyValues *outResourceData ); + virtual void ApplySettings( KeyValues *inResourceData ); + virtual const char *GetDescription( void ); + + MESSAGE_FUNC_PARAMS( OnDialogVariablesChanged, "DialogVariables", dialogVariables ); + + void HandleAutoSizing( void ); + +private: + void Init(); + + Alignment _contentAlignment; + TextImage *_textImage; // this is the textImage, if the full text will not + // fit we put as much as we can and add an elipsis (...) + struct TImageInfo + { + IImage *image; + short offset; + short xpos; + short width; + }; + CUtlVector<TImageInfo> _imageDar; + + int _textInset[2]; + Color _disabledFgColor1; + Color _disabledFgColor2; + Color _associateColor; + int _textImageIndex; // index in the image array that the default _textimage resides + EColorState _textColorState; + + PHandle _associate; + char *_associateName; + + char *_fontOverrideName; + + wchar_t _hotkey; // the hotkey contained in the text + + bool m_bWrap; + bool m_bCenterWrap; + bool m_bAllCaps; + bool m_bAutoWideToContents; + bool m_bAutoWideDirty; + bool m_bUseProportionalInsets; + +}; + +} // namespace vgui + +#endif // LABEL_H diff --git a/public/vgui_controls/ListPanel.h b/public/vgui_controls/ListPanel.h new file mode 100644 index 0000000..9248856 --- /dev/null +++ b/public/vgui_controls/ListPanel.h @@ -0,0 +1,371 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef LISTPANEL_H +#define LISTPANEL_H + +#ifdef _WIN32 +#pragma once +#endif + +#include <utllinkedlist.h> +#include <utlvector.h> +#include <utlrbtree.h> +#include <vgui/VGUI.h> +#include <vgui_controls/Panel.h> + +class KeyValues; + +namespace vgui +{ + +class ScrollBar; +class TextImage; +class ImagePanel; +class Label; +class Button; +class IDraggerEvent; +class FastSortListPanelItem; + +//----------------------------------------------------------------------------- +// Purpose: Generic class for ListPanel items +//----------------------------------------------------------------------------- +class ListPanelItem +{ +public: + ListPanelItem() : + kv( 0 ), + userData( 0 ), + m_pDragData( 0 ), + m_bImage( false ), + m_nImageIndex( -1 ), + m_nImageIndexSelected( -1 ), + m_pIcon( 0 ) + { + } + + KeyValues *kv; + unsigned int userData; + KeyValues *m_pDragData; + bool m_bImage; + int m_nImageIndex; + int m_nImageIndexSelected; + IImage *m_pIcon; +}; + +typedef int __cdecl SortFunc( + ListPanel *pPanel, + const ListPanelItem &item1, + const ListPanelItem &item2 ); + +//----------------------------------------------------------------------------- +// Purpose: A spread-sheet type data view, similar to MFC's +//----------------------------------------------------------------------------- +class ListPanel : public Panel +{ + DECLARE_CLASS_SIMPLE( ListPanel, Panel ); + +public: + ListPanel(Panel *parent, const char *panelName); + ~ListPanel(); + + // COLUMN HANDLING + // all indices are 0 based, limit of 255 columns + // columns are resizable by default + enum ColumnFlags_e + { + COLUMN_FIXEDSIZE = 0x01, // set to have the column be a fixed size + COLUMN_RESIZEWITHWINDOW = 0x02, // set to have the column grow with the parent dialog growing + COLUMN_IMAGE = 0x04, // set if the column data is not text, but instead the index of the image to display + COLUMN_HIDDEN = 0x08, // column is hidden by default + COLUMN_UNHIDABLE = 0x10, // column is unhidable + }; + + // adds a column header + virtual void AddColumnHeader(int index, const char *columnName, const char *columnText, int startingWidth, int minWidth, int maxWidth, int columnFlags = 0); + virtual void AddColumnHeader(int index, const char *columnName, const char *columnText, int width, int columnFlags = 0); + + virtual void RemoveColumn(int column); // removes a column + virtual int FindColumn(const char *columnName); + virtual void SetColumnHeaderHeight( int height ); + virtual void SetColumnHeaderText(int column, const char *text); + virtual void SetColumnHeaderText(int column, wchar_t *text); + virtual void SetColumnHeaderImage(int column, int imageListIndex); + virtual void SetColumnHeaderTooltip(int column, const char *tooltipText); + virtual void SetColumnTextAlignment( int column, int align ); + + // Get information about the column headers. + virtual int GetNumColumnHeaders() const; + virtual bool GetColumnHeaderText( int index, char *pOut, int maxLen ); + + virtual void SetSortFunc(int column, SortFunc *func); + virtual void SetSortColumn(int column); + virtual void SortList( void ); + virtual void SetColumnSortable(int column, bool sortable); + virtual void SetColumnVisible(int column, bool visible); + int GetSortColumn() const; + + // sets whether the user can add/remove columns (defaults to off) + virtual void SetAllowUserModificationOfColumns(bool allowed); + + // DATA HANDLING + // data->GetName() is used to uniquely identify an item + // data sub items are matched against column header name to be used in the table + virtual int AddItem(const KeyValues *data, unsigned int userData, bool bScrollToItem, bool bSortOnAdd); // Takes a copy of the data for use in the table. Returns the index the item is at. + void SetItemDragData( int itemID, const KeyValues *data ); // Makes a copy of the keyvalues to store in the table. Used when dragging from the table. Only used if the caller enables drag support + virtual int GetItemCount( void ); // returns the number of VISIBLE items + virtual int GetItem(const char *itemName); // gets the row index of an item by name (data->GetName()) + virtual KeyValues *GetItem(int itemID); // returns pointer to data the row holds + virtual int GetItemCurrentRow(int itemID); // returns -1 if invalid index or item not visible + virtual int GetItemIDFromRow(int currentRow); // returns -1 if invalid row + virtual unsigned int GetItemUserData(int itemID); + virtual ListPanelItem *GetItemData(int itemID); + virtual void SetUserData( int itemID, unsigned int userData ); + virtual int GetItemIDFromUserData( unsigned int userData ); + virtual void ApplyItemChanges(int itemID); // applies any changes to the data, performed by modifying the return of GetItem() above + virtual void RemoveItem(int itemID); // removes an item from the table (changing the indices of all following items) + virtual void RereadAllItems(); // updates the view with the new data + + virtual void RemoveAll(); // clears and deletes all the memory used by the data items + virtual void DeleteAllItems(); // obselete, use RemoveAll(); + + virtual void GetCellText(int itemID, int column, OUT_Z_BYTECAP(bufferSizeInBytes) wchar_t *buffer, int bufferSizeInBytes); // returns the data held by a specific cell + virtual IImage *GetCellImage(int itemID, int column); //, ImagePanel *&buffer); // returns the image held by a specific cell + + // Use these until they return InvalidItemID to iterate all the items. + virtual int FirstItem() const; + virtual int NextItem( int iItem ) const; + + virtual int InvalidItemID() const; + virtual bool IsValidItemID(int itemID); + + // sets whether the dataitem is visible or not + // it is removed from the row list when it becomes invisible, but stays in the indexes + // this is much faster than a normal remove + virtual void SetItemVisible(int itemID, bool state); + virtual void SetItemDisabled(int itemID, bool state ); + bool IsItemVisible( int itemID ); + + virtual void SetFont(HFont font); + + // image handling + virtual void SetImageList(ImageList *imageList, bool deleteImageListWhenDone); + + // SELECTION + + // returns the count of selected items + virtual int GetSelectedItemsCount(); + + // returns the selected item by selection index, valid in range [0, GetNumSelectedRows) + virtual int GetSelectedItem(int selectionIndex); + + // sets no item as selected + virtual void ClearSelectedItems(); + + virtual bool IsItemSelected( int itemID ); + + // adds a item to the select list + virtual void AddSelectedItem( int itemID ); + + // sets this single item as the only selected item + virtual void SetSingleSelectedItem( int itemID ); + + // returns the selected column, -1 for particular column selected + virtual int GetSelectedColumn(); + + // whether or not to select specific cells (off by default) + virtual void SetSelectIndividualCells(bool state); + + // whether or not multiple cells/rows can be selected + void SetMultiselectEnabled( bool bState ); + bool IsMultiselectEnabled() const; + + // sets a single cell - all other previous rows are cleared + virtual void SetSelectedCell(int row, int column); + + virtual bool GetCellAtPos(int x, int y, int &row, int &column); // returns true if any found, row and column are filled out. x, y are in screen space + virtual bool GetCellBounds( int row, int column, int& x, int& y, int& wide, int& tall ); + + // sets the text which is displayed when the list is empty + virtual void SetEmptyListText(const char *text); + virtual void SetEmptyListText(const wchar_t *text); + + // relayout the scroll bar in response to changing the items in the list panel + // do this if you RemoveAll() + void ResetScrollBar(); + + // Attaches drag data to a particular item + virtual void OnCreateDragData( KeyValues *msg ); + + void SetIgnoreDoubleClick( bool state ); + + // set up a field for editing + virtual void EnterEditMode(int itemID, int column, vgui::Panel *editPanel); + + // leaves editing mode + virtual void LeaveEditMode(); + + // returns true if we are currently in inline editing mode + virtual bool IsInEditMode(); + + MESSAGE_FUNC_INT( ResizeColumnToContents, "ResizeColumnToContents", column ); + +#ifdef _X360 + virtual void NavigateTo(); +#endif + /// Version number for file format of user config. This defaults to 1, + /// and if you rearrange columns you can increment it to cause any old + /// user configs (which will be screwed up) to be discarded. + int m_nUserConfigFileVersion; + +protected: + // PAINTING + virtual Panel *GetCellRenderer(int row, int column); + + // overrides + virtual void OnMouseWheeled(int delta); + virtual void OnSizeChanged(int wide, int tall); + virtual void PerformLayout(); + virtual void Paint(); + virtual void PaintBackground(); + virtual void ApplySchemeSettings(IScheme *pScheme); + virtual void OnMousePressed( MouseCode code ); + virtual void OnMouseDoublePressed( MouseCode code ); +#ifdef _X360 + virtual void OnKeyCodePressed(KeyCode code); +#else + virtual void OnKeyCodePressed( KeyCode code ); +#endif + MESSAGE_FUNC( OnSliderMoved, "ScrollBarSliderMoved" ); + MESSAGE_FUNC_INT_INT( OnColumnResized, "ColumnResized", column, delta ); + MESSAGE_FUNC_INT( OnSetSortColumn, "SetSortColumn", column ); + MESSAGE_FUNC( OpenColumnChoiceMenu, "OpenColumnChoiceMenu" ); + MESSAGE_FUNC_INT( OnToggleColumnVisible, "ToggleColumnVisible", col ); + virtual float GetRowsPerPage(); + virtual int GetStartItem(); + + // user configuration + virtual void ApplyUserConfigSettings(KeyValues *userConfig); + virtual void GetUserConfigSettings(KeyValues *userConfig); + virtual bool HasUserConfigSettings(); + + /* MESSAGES SENT + "ItemSelected" - query which items are selected + "ItemDeselected" - query which items are selected + */ + +public: + virtual void SetSortColumnEx( int iPrimarySortColumn, int iSecondarySortColumn, bool bSortAscending ); + void GetSortColumnEx( int &iPrimarySortColumn, int &iSecondarySortColumn, bool &bSortAscending ) const; + +private: + // Cleans up allocations associated with a particular item + void CleanupItem( FastSortListPanelItem *data ); + + // adds the item into the column indexes + void IndexItem(int itemID); + + // Purpose: + void UpdateSelection( vgui::MouseCode code, int x, int y, int row, int column ); + + // Handles multiselect + void HandleMultiSelection( int itemID, int row, int column ); + + // Handles addselect + void HandleAddSelection( int itemID, int row, int column ); + + // pre-sorted columns + struct IndexItem_t + { + ListPanelItem *dataItem; + int duplicateIndex; + }; + typedef CUtlRBTree<IndexItem_t, int> IndexRBTree_t; + + struct column_t + { + Button *m_pHeader; + int m_iMinWidth; + int m_iMaxWidth; + bool m_bResizesWithWindow; + Panel *m_pResizer; + SortFunc *m_pSortFunc; + bool m_bTypeIsText; + bool m_bHidden; + bool m_bUnhidable; + IndexRBTree_t m_SortedTree; + int m_nContentAlignment; + }; + + // list of the column headers + CUtlLinkedList<column_t, unsigned char> m_ColumnsData; + + // persistent list of all columns ever created, indexes into m_ColumnsData - used for matching up DATAITEM m_SortedTreeIndexes + CUtlVector<unsigned char> m_ColumnsHistory; + + // current list of columns, indexes into m_ColumnsData + CUtlVector<unsigned char> m_CurrentColumns; + + int m_iColumnDraggerMoved; // which column dragger was moved->which header to resize + int m_lastBarWidth; + + CUtlLinkedList<FastSortListPanelItem*, int> m_DataItems; + CUtlVector<int> m_VisibleItems; + + // set to true if the table needs to be sorted before it's drawn next + int m_iSortColumn; + int m_iSortColumnSecondary; + + void ResortColumnRBTree(int col); + static bool RBTreeLessFunc(vgui::ListPanel::IndexItem_t &item1, vgui::ListPanel::IndexItem_t &item2); + + TextImage *m_pTextImage; // used in rendering + ImagePanel *m_pImagePanel; // used in rendering + Label *m_pLabel; // used in rendering + ScrollBar *m_hbar; + ScrollBar *m_vbar; + + int m_iSelectedColumn; + + bool m_bNeedsSort : 1; + bool m_bSortAscending : 1; + bool m_bSortAscendingSecondary : 1; + bool m_bCanSelectIndividualCells : 1; + bool m_bShiftHeldDown : 1; + bool m_bMultiselectEnabled : 1; + bool m_bAllowUserAddDeleteColumns : 1; + bool m_bDeleteImageListWhenDone : 1; + bool m_bIgnoreDoubleClick : 1; + + int m_iHeaderHeight; + int m_iRowHeight; + + // selection data + CUtlVector<int> m_SelectedItems; // array of selected rows + int m_LastItemSelected; // remember the last row selected for future shift clicks + + int m_iTableStartX; + int m_iTableStartY; + + Color m_LabelFgColor; + Color m_DisabledColor; + Color m_SelectionFgColor; + Color m_DisabledSelectionFgColor; + + ImageList *m_pImageList; + TextImage *m_pEmptyListText; + + PHandle m_hEditModePanel; + int m_iEditModeItemID; + int m_iEditModeColumn; + + void ResetColumnHeaderCommands(); +}; + +} + +#endif // LISTPANEL_H diff --git a/public/vgui_controls/ListViewPanel.h b/public/vgui_controls/ListViewPanel.h new file mode 100644 index 0000000..39f1bec --- /dev/null +++ b/public/vgui_controls/ListViewPanel.h @@ -0,0 +1,121 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef LISTVIEWPANEL_H +#define LISTVIEWPANEL_H + +#ifdef _WIN32 +#pragma once +#endif + +#include <utllinkedlist.h> +#include <utlvector.h> + +namespace vgui +{ + +class ListViewPanel; +typedef bool (*ListViewSortFunc_t)(KeyValues *kv1, KeyValues *kv2); + +class ListViewItem; + +//----------------------------------------------------------------------------- +// Purpose: List Ctrl Panel with each item having an icon and text after it +//----------------------------------------------------------------------------- +class ListViewPanel : public Panel +{ + DECLARE_CLASS_SIMPLE( ListViewPanel, Panel ); + +public: + ListViewPanel(Panel *parent, const char *panelName); + ~ListViewPanel(); + + virtual int AddItem(const KeyValues *data, bool bScrollToItem, bool bSortOnAdd); + virtual int GetItemCount(); + virtual KeyValues *GetItem(int itemID); + virtual void ApplyItemChanges(int itemID); + virtual void RemoveItem(int itemID); + virtual void DeleteAllItems(); + virtual int GetItemIDFromPos(int iPos); // valid from [0, GetItemCount) + + virtual int InvalidItemID(); + virtual bool IsValidItemID(int itemID); + + virtual void ScrollToItem(int itemID); + + virtual void SetSortFunc(ListViewSortFunc_t func); + virtual void SortList(); + + // image handling + virtual void SetImageList(ImageList *imageList, bool deleteImageListWhenDone); + + virtual void SetFont(HFont font); + + // returns the count of selected items + virtual int GetSelectedItemsCount(); + + // returns the selected item by selection index, valid in range [0, GetNumSelectedRows) + virtual int GetSelectedItem(int selectionIndex); + + // sets no item as selected + virtual void ClearSelectedItems(); + + // adds a item to the select list + virtual void AddSelectedItem(int itemID); + + // sets this single item as the only selected item + virtual void SetSingleSelectedItem(int itemID); + +protected: + // overrides + virtual void OnMouseWheeled(int delta); + virtual void OnSizeChanged(int wide, int tall); + virtual void PerformLayout(); + virtual void Paint(); + virtual void ApplySchemeSettings(IScheme *pScheme); + virtual void OnMousePressed( MouseCode code); + virtual void OnMouseDoublePressed( MouseCode code); + virtual void OnKeyCodeTyped( KeyCode code); + virtual void OnKeyTyped(wchar_t unichar); + MESSAGE_FUNC( OnSliderMoved, "ScrollBarSliderMoved" ); + virtual int GetItemsPerColumn(); + +private: + ScrollBar *m_hbar; + + friend class ListViewItem; + void OnItemMousePressed(ListViewItem* pItem, MouseCode code); + void OnItemMouseDoublePressed(ListViewItem* pItem, MouseCode code); + int GetItemsMaxWidth(); + int GetItemIndex(int itemID); + void OnShiftSelect(int itemID); + void FinishKeyPress(int itemID); + + CUtlLinkedList<ListViewItem*, int> m_DataItems; + CUtlVector<int> m_SortedItems; + ListViewSortFunc_t m_pSortFunc; + + int m_iRowHeight; + HFont m_hFont; + + Color m_LabelFgColor; + Color m_SelectionFgColor; + + // selection data + CUtlVector<int> m_SelectedItems; + int m_LastSelectedItemID; + int m_ShiftStartItemID; + + bool m_bNeedsSort; + bool m_bDeleteImageListWhenDone; + ImageList *m_pImageList; +}; + + +} + +#endif // LISTVIEWPANEL_H diff --git a/public/vgui_controls/Menu.h b/public/vgui_controls/Menu.h new file mode 100644 index 0000000..fbe44b2 --- /dev/null +++ b/public/vgui_controls/Menu.h @@ -0,0 +1,380 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//===========================================================================// + +#ifndef MENU_H +#define MENU_H + +#ifdef _WIN32 +#pragma once +#endif + +#include <vgui_controls/Panel.h> +#include <vgui_controls/Label.h> +#include <utllinkedlist.h> +#include <utlvector.h> + +namespace vgui +{ + +class MenuItem; +class ScrollBar; +class MenuSeparator; + +//----------------------------------------------------------------------------- +// Purpose: A menu is a list of items that can be selected with one click, navigated +// with arrow keys and/or hot keys, and have a lit behavior when mouse over. +// It is NOT the button which opens the menu, but only the menu itself. +// +// Behaviour spec: +// Menu navigation can be done in 2 modes, via keyboard keys and via mouse. +// Clicking on menu button opens menu. +// Only one item in a menu is highlighted at a time. +// Only one submenu in a menu is open at a time. +// Disabled menuitems get highlighted via mouse and keys but will not activate. +// +// Mouse: +// Moving mouse into a menuitem highlights it. +// If the menuitem has a cascading menu, the menu opens when the mouse enters +// the menuitem. The cascading menuitem stays highlighted while its menu is open. +// No submenu items are highlighted by default. +// Moving the mouse into another menuitem closes any previously open submenus in the list. +// Clicking once in the menu item activates the menu item and closes all menus. +// Moving the mouse off a menuitem unhighlights it. +// The scroll bar arrows can be used to move up/down the menu one item at a time. +// The clicking and dragging on the scroll bar nob also scrolls the menu items. +// If a highlighed menuitem scrolls off, and the user then begins navigating via keys, +// the menu will snap the scroll bar so the highlighted item is visible. +// If user has been navigating via keys, moving the mouse over a menu item +// highlights it. +// Mousewheel: +// You must have the mouse inside the menu/scroll bar to use the wheel. +// The mouse wheel moves the highlighted menuitem up or down the list. +// If the list has no scroll bar the wheel will cycle from the bottom of the list +// to the top of the list and vice versa. +// If the list has a scrollbar the mouse wheel will stop at the top or bottom +// of the list. +// If the mouse is over the scroll bar no items are highlighted. +// Keyboard: +// When a menu is opened, no items are highlighted. +// If a menuitem has a cascading menu it does not open when the item is highlighted. +// The down arrow selects the next item in the list. +// (first item if none are highlighted and there is a scrollbar). +// The up arrow selects the previous item in the list +// (first item if none are highlighted and there is a scrollbar, last item if none are +// highlighted and there is no scrollbar). +// Selecting a new menuitem closes any previously open submenus in the list. +// The enter key activates the selected item and closes all menus. +// If the selected item has a cascading menu, activating it opens its submenu. +// These may also be activated by pressing the right arrow. +// Pressing the left arrow closes the submenu. +// When the submenu is opened the cascading menuitem stays highlighted. +// No items in the submenu are highlighted when it is opened. +// +// Note: Cascading menuitems in menus with a scrollbar is not supported. +// Its a clunky UI and if we want this we should design a better solution, +// perhaps along the lines of how explorer's bookmarks does it. +// It currently functions, but there are some arm/disarm bugs. +// +// +//----------------------------------------------------------------------------- +class Menu : public Panel +{ + DECLARE_CLASS_SIMPLE( Menu, Panel ); + friend class MenuItem; +public: + enum MenuDirection_e + { + LEFT, + RIGHT, + UP, + DOWN, + CURSOR, // make the menu appear under the mouse cursor + ALIGN_WITH_PARENT, // make the menu appear under the parent + }; + + Menu(Panel *parent, const char *panelName); + ~Menu(); + + static void PlaceContextMenu( Panel *parent, Menu *menu ); + static void OnInternalMousePressed( Panel *other, MouseCode code ); + + virtual void PositionRelativeToPanel( Panel *reference, MenuDirection_e direction, int nAdditionalYOffset = 0, bool showMenu = false ); + + // the menu. For combo boxes, it's the edit/field, etc. etc. + + // Add a simple text item to the menu + virtual int AddMenuItem( const char *itemName, const char *itemText, const char *command, Panel *target, const KeyValues *userData = NULL ); + virtual int AddMenuItem( const char *itemName, const wchar_t *wszItemText, const char *command, Panel *target, const KeyValues *userData = NULL ); + + virtual int AddMenuItem( const char *itemName, const char *itemText, KeyValues *message, Panel *target , const KeyValues *userData = NULL); + virtual int AddMenuItem( const char *itemName, const wchar_t *wszItemText, KeyValues *message, Panel *target , const KeyValues *userData = NULL); + + virtual int AddMenuItem( const char *itemText, const char *command, Panel *target , const KeyValues *userData = NULL); + virtual int AddMenuItem( const char *itemText, KeyValues *message, Panel *target, const KeyValues *userData = NULL ); + virtual int AddMenuItem( const char *itemText, Panel *target, const KeyValues *userData = NULL ); + + // Add a checkable item to the menu + virtual int AddCheckableMenuItem( const char *itemName, const char *itemText, const char *command, Panel *target, const KeyValues *userData = NULL ); + virtual int AddCheckableMenuItem( const char *itemName, const wchar_t *wszItemText, const char *command, Panel *target, const KeyValues *userData = NULL ); + + virtual int AddCheckableMenuItem( const char *itemName, const char *itemText, KeyValues *message, Panel *target, const KeyValues *userData = NULL ); + virtual int AddCheckableMenuItem( const char *itemName, const wchar_t *wszItemText, KeyValues *message, Panel *target, const KeyValues *userData = NULL ); + + virtual int AddCheckableMenuItem( const char *itemText, const char *command, Panel *target , const KeyValues *userData = NULL); + virtual int AddCheckableMenuItem( const char *itemText, KeyValues *message, Panel *target, const KeyValues *userData = NULL ); + virtual int AddCheckableMenuItem( const char *itemText, Panel *target, const KeyValues *userData = NULL ); + + // Add a cascading menu item to the menu + virtual int AddCascadingMenuItem( const char *itemName, const char *itemText, const char *command, Panel *target, Menu *cascadeMenu, const KeyValues *userData = NULL ); + virtual int AddCascadingMenuItem( const char *itemName, const wchar_t *wszItemText, const char *command, Panel *target, Menu *cascadeMenu, const KeyValues *userData = NULL ); + + virtual int AddCascadingMenuItem( const char *itemName, const char *itemText, KeyValues *message, Panel *target, Menu *cascadeMenu, const KeyValues *userData = NULL ); + virtual int AddCascadingMenuItem( const char *itemName, const wchar_t *wszItemText, KeyValues *message, Panel *target, Menu *cascadeMenu, const KeyValues *userData = NULL ); + + virtual int AddCascadingMenuItem( const char *itemText, const char *command, Panel *target, Menu *cascadeMenu, const KeyValues *userData = NULL ); + virtual int AddCascadingMenuItem( const char *itemText, KeyValues *message, Panel *target, Menu *cascadeMenu, const KeyValues *userData = NULL ); + virtual int AddCascadingMenuItem( const char *itemText, Panel *target, Menu *cascadeMenu, const KeyValues *userData = NULL ); + + // Add a custom panel to the menu + virtual int AddMenuItem( MenuItem *panel ); + + virtual void AddSeparator(); + virtual void AddSeparatorAfterItem( int itemID ); + + // Sets the values of a menu item at the specified index + virtual void UpdateMenuItem(int itemID, const char *itemText,KeyValues *message, const KeyValues *userData = NULL); + virtual void UpdateMenuItem(int itemID, const wchar_t *wszItemText,KeyValues *message, const KeyValues *userData = NULL); + + virtual void MoveMenuItem( int itemID, int moveBeforeThisItemID ); + + virtual bool IsValidMenuID(int itemID); + virtual int GetInvalidMenuID(); + + KeyValues *GetItemUserData(int itemID); + void GetItemText(int itemID, wchar_t *text, int bufLenInBytes); + void GetItemText(int itemID, char *text, int bufLenInBytes); + + virtual void SetItemEnabled(const char *itemName, bool state); + virtual void SetItemEnabled(int itemID, bool state); + virtual void SetItemVisible(const char *itemName, bool visible); + virtual void SetItemVisible(int itemID, bool visible); + + // Remove a single item + void DeleteItem( int itemID ); + + // Clear the menu, deleting all the menu items within + void DeleteAllItems(); + + // Override the auto-width setting with a single fixed width + virtual void SetFixedWidth( int width ); + + // Sets the content alignment of all items in the menu + void SetContentAlignment( Label::Alignment alignment ); + + // sets the height of each menu item + virtual void SetMenuItemHeight(int itemHeight); + virtual int GetMenuItemHeight() const; + + // Set the max number of items visible (scrollbar appears with more) + virtual void SetNumberOfVisibleItems( int numItems ); + + // Add the menu to the menu manager (see Menu::SetVisible())? + void EnableUseMenuManager( bool bUseMenuManager ); + + // Set up the menu items layout + virtual void PerformLayout( void ); + + virtual void SetBorder(class IBorder *border); + virtual void ApplySchemeSettings(IScheme *pScheme); + + // Set type ahead behaviour + enum MenuTypeAheadMode + { + COMPAT_MODE = 0, + HOT_KEY_MODE, + TYPE_AHEAD_MODE, + }; + virtual void SetTypeAheadMode(MenuTypeAheadMode mode); + virtual int GetTypeAheadMode(); + + // Hotkey handling + virtual void OnKeyTyped(wchar_t unichar); + // Menu nagivation etc. + virtual void OnKeyCodeTyped( KeyCode code ); + + // Visibility + virtual void SetVisible(bool state); + + // Activates item in the menu list, as if that menu item had been selected by the user + virtual void ActivateItem(int itemID); + virtual void SilentActivateItem(int itemID); // activate item, but don't fire the action signal + virtual void ActivateItemByRow(int row); + virtual int GetActiveItem(); // returns the itemID (not the row) of the active item + + // Return the number of items currently in the menu list + virtual int GetItemCount() const; + + // return the menuID of the n'th item in the menu list, valid from [0, GetItemCount) + virtual int GetMenuID(int index); + + // Return the number of items currently visible in the menu list + int GetCurrentlyVisibleItemsCount(); + + MenuItem *GetMenuItem(int itemID); + void CloseOtherMenus(MenuItem *item); + virtual void OnKillFocus(); + + int GetMenuMode(); + enum MenuMode + { + MOUSE = 0, + KEYBOARD, + }; + + void SetCurrentlyHighlightedItem(int itemID); + int GetCurrentlyHighlightedItem(); + void ClearCurrentlyHighlightedItem(); + + // Set the checked state of a checkable menuItem + void SetMenuItemChecked(int itemID, bool state); + bool IsChecked(int index); // check if item is checked. + + + void SetMinimumWidth(int width); + int GetMinimumWidth(); + + // baseclass overrides to chain colors through to cascade menus + virtual void SetFgColor( Color newColor ); + virtual void SetBgColor( Color newColor ); + + virtual void SetFont( HFont font ); + + // Pass in NULL hotkey to remove hotkey + void SetCurrentKeyBinding( int itemID, char const *hotkey ); + + void ForceCalculateWidth(); + + void SetUseFallbackFont( bool bState, HFont hFallback ); + +protected: + // helper functions + int AddMenuItemCharCommand(MenuItem *item, const char *command, Panel *target, const KeyValues *userData); + int AddMenuItemKeyValuesCommand(MenuItem *item, KeyValues *message, Panel *target, const KeyValues *userData); + + // vgui result reporting + virtual void OnCommand( const char *command ); + MESSAGE_FUNC_PTR( OnMenuItemSelected, "MenuItemSelected", panel ); + virtual void AddScrollBar(); + virtual void RemoveScrollBar(); + MESSAGE_FUNC( OnSliderMoved, "ScrollBarSliderMoved" ); + virtual void Paint(); + virtual void LayoutMenuBorder(); + virtual void MakeItemsVisibleInScrollRange( int maxVisibleItems, int nNumPixelsAvailable ); + virtual void OnMouseWheeled(int delta); + // Alternate OnKeyTyped behaviors + virtual void OnHotKey(wchar_t unichar); + virtual void OnTypeAhead(wchar_t unichar); + + int CountVisibleItems(); + void ComputeWorkspaceSize( int& workWide, int& workTall ); + int ComputeFullMenuHeightWithInsets(); + + void CalculateWidth(); + + void LayoutScrollBar(); + void PositionCascadingMenu(); + void SizeMenuItems(); + void OnCursorMoved(int x, int y); + void OnKeyCodePressed(KeyCode code); + void OnMenuClose(); + MESSAGE_FUNC( OnKeyModeSet, "KeyModeSet" ); + + void SetCurrentlySelectedItem(MenuItem *item); + void SetCurrentlySelectedItem(int itemID); + MESSAGE_FUNC_INT( OnCursorEnteredMenuItem, "CursorEnteredMenuItem", VPanel); + MESSAGE_FUNC_INT( OnCursorExitedMenuItem, "CursorExitedMenuItem", VPanel); + + void MoveAlongMenuItemList(int direction, int loopCount); + + enum + { + DEFAULT_MENU_ITEM_HEIGHT = 22, // height of items in the menu + MENU_UP = -1, // used for moving up/down list of menu items in the menu + MENU_DOWN = 1 + }; + +#ifdef DBGFLAG_VALIDATE + virtual void Validate( CValidator &validator, char *pchName ); +#endif // DBGFLAG_VALIDATE + +private: + MenuItem *GetParentMenuItem(); + + int m_iMenuItemHeight; + int m_iFixedWidth; + int m_iMinimumWidth; // a minimum width the menu has to be if it is not fixed width + int m_iNumVisibleLines; // number of items in menu before scroll bar adds on + ScrollBar *m_pScroller; + + CUtlLinkedList<MenuItem*, int> m_MenuItems; + + CUtlVector<int> m_VisibleSortedItems; + CUtlVector<int> m_SortedItems; // used for visual + CUtlVector<int> m_Separators; // menu item ids after which separators should be shown + CUtlVector<MenuSeparator *> m_SeparatorPanels; + + bool _sizedForScrollBar: 1 ; // whether menu has been sized for a scrollbar + bool m_bUseFallbackFont : 1; + bool _recalculateWidth : 1; + bool m_bUseMenuManager : 1; + + int _menuWide; + int m_iCurrentlySelectedItemID; + int m_iInputMode; + int m_iCheckImageWidth; // the size of the check box spot on a checkable menu. + int m_iProportionalScrollBarSize; + Label::Alignment m_Alignment; + Color _borderDark; + int m_iActivatedItem; + HFont m_hItemFont; + HFont m_hFallbackItemFont; + + // for managing type ahead + #define TYPEAHEAD_BUFSIZE 256 + MenuTypeAheadMode m_eTypeAheadMode; + wchar_t m_szTypeAheadBuf[TYPEAHEAD_BUFSIZE]; + int m_iNumTypeAheadChars; + double m_fLastTypeAheadTime; +}; + + +//----------------------------------------------------------------------------- +// Helper class to create menu +//----------------------------------------------------------------------------- +class MenuBuilder +{ +public: + + MenuBuilder( Menu *pMenu, Panel *pActionTarget ); + + MenuItem* AddMenuItem( const char *pszButtonText, const char *pszCommand, const char *pszCategoryName ); + MenuItem* AddMenuItem( const char *pszButtonText, KeyValues *kvUserData, const char *pszCategoryName ); + + MenuItem* AddCascadingMenuItem( const char *pszButtonText, Menu *pSubMenu, const char *pszCategoryName ); + +private: + + void AddSepratorIfNeeded( const char *pszCategoryName ); + + Menu *m_pMenu; + Panel *m_pActionTarget; + const char *m_pszLastCategory; +}; + +} // namespace vgui + +#endif // MENU_H diff --git a/public/vgui_controls/MenuBar.h b/public/vgui_controls/MenuBar.h new file mode 100644 index 0000000..01ccc06 --- /dev/null +++ b/public/vgui_controls/MenuBar.h @@ -0,0 +1,54 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef MENUBAR_H +#define MENUBAR_H + +#ifdef _WIN32 +#pragma once +#endif + +#include <vgui_controls/Panel.h> +#include <utlvector.h> + +namespace vgui +{ + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +class MenuBar : public Panel +{ + DECLARE_CLASS_SIMPLE( MenuBar, Panel ); + +public: + MenuBar(Panel *parent, const char *panelName); + ~MenuBar(); + + virtual void AddButton(MenuButton *button); // add button to end of menu list + virtual void AddMenu( const char *pButtonName, Menu *pMenu ); + + virtual void GetContentSize( int& w, int&h ); + +protected: + virtual void OnKeyCodeTyped(KeyCode code); + virtual void OnKeyTyped(wchar_t unichar); + virtual void ApplySchemeSettings(IScheme *pScheme); + virtual void PerformLayout(); + virtual void Paint(); + MESSAGE_FUNC( OnMenuClose, "MenuClose" ); + MESSAGE_FUNC_INT( OnCursorEnteredMenuButton, "CursorEnteredMenuButton", VPanel); + +private: + CUtlVector<MenuButton *> m_pMenuButtons; + int m_nRightEdge; +}; + +} // namespace vgui + +#endif // MENUBAR_H + diff --git a/public/vgui_controls/MenuButton.h b/public/vgui_controls/MenuButton.h new file mode 100644 index 0000000..a90fb23 --- /dev/null +++ b/public/vgui_controls/MenuButton.h @@ -0,0 +1,82 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef MENUBUTTON_H +#define MENUBUTTON_H + +#ifdef _WIN32 +#pragma once +#endif + +#include <vgui_controls/Button.h> +#include "vgui_controls/Menu.h" + +namespace vgui +{ + +class Menu; +class TextImage; + +//----------------------------------------------------------------------------- +// Purpose: Button that displays a menu when pressed +//----------------------------------------------------------------------------- +class MenuButton : public Button +{ + DECLARE_CLASS_SIMPLE( MenuButton, Button ); + +public: + MenuButton(Panel *parent, const char *panelName, const char *text); + ~MenuButton(); + + // functions designed to be overriden + virtual void OnShowMenu(Menu *menu) {} + virtual void OnHideMenu(Menu *menu) {} + virtual int OnCheckMenuItemCount() { return 0; } + + virtual void SetMenu(Menu *menu); + virtual void HideMenu(void); + virtual void DrawFocusBorder(int tx0, int ty0, int tx1, int ty1); + MESSAGE_FUNC( OnMenuClose, "MenuClose" ); + MESSAGE_FUNC_PARAMS( OnKillFocus, "KillFocus", kv ); // called after the panel loses the keyboard focus + virtual void DoClick(); + virtual void SetOpenOffsetY(int yOffset); + + virtual bool CanBeDefaultButton(void); + + // sets the direction in which the menu opens from the button, defaults to down + virtual void SetOpenDirection(Menu::MenuDirection_e direction); + + virtual void OnKeyCodeTyped(KeyCode code); + virtual void OnCursorEntered(); + + virtual void Paint(); + virtual void PerformLayout(); + virtual void ApplySchemeSettings( IScheme *pScheme ); + virtual void OnCursorMoved( int x, int y ); + + // This style is like the IE "back" button where the left side acts like a regular button, the the right side has a little + // combo box dropdown indicator and presents and submenu + void SetDropMenuButtonStyle( bool state ); + bool IsDropMenuButtonStyle() const; + + Menu *GetMenu(); + +private: + + Menu *m_pMenu; + Menu::MenuDirection_e m_iDirection; + + int _openOffsetY; // vertical offset of menu from the menu button + + bool m_bDropMenuButtonStyle : 1; + TextImage *m_pDropMenuImage; + int m_nImageIndex; +}; + +}; // namespace vgui + +#endif // MENUBUTTON_H diff --git a/public/vgui_controls/MenuItem.h b/public/vgui_controls/MenuItem.h new file mode 100644 index 0000000..6baa512 --- /dev/null +++ b/public/vgui_controls/MenuItem.h @@ -0,0 +1,136 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef MENUITEM_H +#define MENUITEM_H + +#ifdef _WIN32 +#pragma once +#endif + +#include <vgui/VGUI.h> +#include <vgui_controls/Button.h> +#include <vgui_controls/Menu.h> + +namespace vgui +{ + +class IBorder; +class TextImage; +class Menu; +class Image; + +//----------------------------------------------------------------------------- +// Purpose: The items in a menu +// MenuItems MUST have the Menu class as parents. +//----------------------------------------------------------------------------- +class MenuItem : public Button +{ + DECLARE_CLASS_SIMPLE( MenuItem, Button ); + +public: + MenuItem(Menu *parent, const char *panelName, const char *text, Menu *cascadeMenu = NULL, bool checkable = false); + MenuItem(Menu *parent, const char *panelName, const wchar_t *wszText, Menu *cascadeMenu = NULL, bool checkable = false); + ~MenuItem(); + + virtual void Paint(); + + // Activate the menu item as if it had been selected by the user + virtual void FireActionSignal(); + + virtual bool CanBeDefaultButton(void); + + // Handle mouse cursor entering a MenuItem. + void OnCursorEntered(); + // Handle mouse cursor exiting a MenuItem. + void OnCursorExited(); + + // Close the cascading menu if we have one. + void CloseCascadeMenu(); + + // Pass kill focus events up to parent on loss of focus + MESSAGE_FUNC( OnKillFocus, "MenuClose" ); + + // Return true if this item triggers a cascading menu + bool HasMenu(); + + // Set the size of the text portion of the label. + void SetTextImageSize(int wide, int tall); + + //Return the size of the text portion of the label. + void GetTextImageSize(int &wide, int &tall); + + // Return the size of the arrow portion of the label. + void GetArrowImageSize(int &wide, int &tall); + + // Return the size of the check portion of the label. + void GetCheckImageSize(int &wide, int &tall); + + // Return the menu that this menuItem contains + Menu *GetMenu(); + + virtual void PerformLayout(); + + // Respond to cursor movement + void OnCursorMoved(int x, int y); + + // Highlight item + MESSAGE_FUNC( ArmItem, "ArmItem" ); + // Unhighlight item. + MESSAGE_FUNC( DisarmItem, "DisarmItem" ); + + // is the item highlighted? + bool IsItemArmed(); + + // Open cascading menu if there is one. + void OpenCascadeMenu(); + + bool IsCheckable(); + bool IsChecked(); + + // Set a checkable menuItem checked or unchecked. + void SetChecked(bool state); + + KeyValues *GetUserData(); + void SetUserData(const KeyValues *kv); + + int GetActiveItem() { if ( m_pCascadeMenu ) { return m_pCascadeMenu->GetActiveItem(); } else { return 0; }} + + Menu *GetParentMenu(); + + void SetCurrentKeyBinding( char const *keyName ); + + virtual void GetContentSize( int& cw, int &ch ); + +protected: + void OnKeyCodeReleased(KeyCode code); + void OnMenuClose(); + MESSAGE_FUNC( OnKeyModeSet, "KeyModeSet" ); + + // vgui overrides + virtual void Init( void ); + virtual void ApplySchemeSettings(IScheme *pScheme); + virtual IBorder *GetBorder(bool depressed, bool armed, bool selected, bool keyfocus); + +private: + enum { CHECK_INSET = 6 }; + Menu *m_pCascadeMenu; // menu triggered to open upon selecting this menu item + bool m_bCheckable; // can this menu item have a little check to the left of it when you select it? + bool m_bChecked; // whether item is checked or not. + TextImage *m_pCascadeArrow; // little arrow that appears to the right of menuitems that open a menu + Image *m_pCheck; // the check that appears to the left of checked menu items + TextImage *m_pBlankCheck; // a blank image same size as the check for when items are not checked. + + TextImage *m_pCurrentKeyBinding; // An optional indicator for the key currently bound to this menu item + + KeyValues *m_pUserData; + +}; + +} // namespace vgui + +#endif // MENUITEM_H diff --git a/public/vgui_controls/MessageBox.h b/public/vgui_controls/MessageBox.h new file mode 100644 index 0000000..4791822 --- /dev/null +++ b/public/vgui_controls/MessageBox.h @@ -0,0 +1,98 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef MESSAGEBOX_H +#define MESSAGEBOX_H + +#ifdef _WIN32 +#pragma once +#endif + +#include <vgui/VGUI.h> +#include <vgui_controls/Frame.h> + +// prevent windows macros from messing with the class +#ifdef MessageBox +#undef MessageBox +#endif + +namespace vgui +{ + +//----------------------------------------------------------------------------- +// Purpose: Popup discardable message box +//----------------------------------------------------------------------------- +class MessageBox : public Frame +{ + DECLARE_CLASS_SIMPLE( MessageBox, Frame ); + +public: + // title - Text to be displayed in the title bar of the window + // text - Text message in the message box + // startMinimized - wether message box starts minimized. Starts invisible by default + // parent - parent panel of the message box, by default it has no parent. This will keep the box visible until the OK button is pressed. + MessageBox(const char *title, const char *text, Panel *parent = NULL); + MessageBox(const wchar_t *wszTitle, const wchar_t *wszText, Panel *parent = NULL); + ~MessageBox(); + + // Put the message box into a modal state + virtual void DoModal(Frame *pFrameOver = NULL); + + // make the message box appear and in a modeless state + virtual void ShowWindow(Frame *pFrameOver = NULL); + + // Set a string command to be sent when the OK button is pressed + // Use AddActionSignalTarget() to mark yourself as a recipient of the command + virtual void SetCommand(const char *command); + virtual void SetCommand(KeyValues *command); + + // Set the visibility of the OK button. + virtual void SetOKButtonVisible(bool state); + + // Set the text on the OK button + virtual void SetOKButtonText(const char *buttonText); + virtual void SetOKButtonText(const wchar_t *wszButtonText); + + // Cancel button (off by default) + void SetCancelButtonVisible(bool state); + void SetCancelButtonText(const char *buttonText); + void SetCancelButtonText(const wchar_t *wszButtonText); + void SetCancelCommand( KeyValues *command ); + + // Toggles visibility of the close box. + virtual void DisableCloseButton(bool state); + + virtual void OnCommand( const char *pCommand ); + + // Shows the message box over the cursor + void ShowMessageBoxOverCursor( bool bEnable ); + +protected: + virtual void PerformLayout(); + virtual void ApplySchemeSettings(IScheme *pScheme); + +protected: + Button *m_pOkButton; + Button *m_pCancelButton; + Label *m_pMessageLabel; + +private: + MESSAGE_FUNC( OnShutdownRequest, "ShutdownRequest" ); + + void Init(); + + KeyValues *m_OkCommand; + KeyValues *m_CancelCommand; + vgui::Frame *m_pFrameOver; + bool m_bNoAutoClose : 1; + bool m_bShowMessageBoxOverCursor : 1; +}; + +} // namespace vgui + + +#endif // MESSAGEBOX_H diff --git a/public/vgui_controls/MessageDialog.h b/public/vgui_controls/MessageDialog.h new file mode 100644 index 0000000..191bb2b --- /dev/null +++ b/public/vgui_controls/MessageDialog.h @@ -0,0 +1,154 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: Contains the CMessageDialog declaration +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef MESSAGEDIALOG_H +#define MESSAGEDIALOG_H +#ifdef _WIN32 +#pragma once +#endif + +// styles +#define MD_WARNING 0x0001 +#define MD_ERROR 0x0002 + +// button configurations +#define MD_OK 0x0004 // 1 button - OK +#define MD_CANCEL 0x0008 // 1 button - CANCEL +#define MD_OKCANCEL 0x0010 // 2 buttons - OK and CANCEL +#define MD_YESNO 0x0020 // 2 buttons - YES and NO + +// behavior +#define MD_SIMPLEFRAME 0x0100 // legacy corners +#define MD_COMMANDAFTERCLOSE 0x0200 // send command at dialog termination (i.e. after fade) +#define MD_RESTRICTPAINT 0x0400 // only paint this dialog (hide any other ui elements) +#define MD_COMMANDONFORCECLOSE 0x0800 // send command when the dialog is closed assuming A input + +// dialog type +enum EDialogType +{ + MD_SAVE_BEFORE_QUIT, + MD_QUIT_CONFIRMATION, + MD_QUIT_CONFIRMATION_TF, + MD_KICK_CONFIRMATION, + MD_CLIENT_KICKED, + MD_LOST_HOST, + MD_LOST_SERVER, + MD_SEARCHING_FOR_GAMES, + MD_CREATING_GAME, + MD_MODIFYING_SESSION, + MD_SESSION_SEARCH_FAILED, + MD_SESSION_CREATE_FAILED, + MD_SESSION_CONNECTING, + MD_SESSION_CONNECT_NOTAVAILABLE, + MD_SESSION_CONNECT_SESSIONFULL, + MD_SESSION_CONNECT_FAILED, + MD_EXIT_SESSION_CONFIRMATION, + MD_STORAGE_DEVICES_NEEDED, + MD_STORAGE_DEVICES_CHANGED, + MD_STORAGE_DEVICES_TOO_FULL, + MD_NOT_ONLINE_ENABLED, + MD_NOT_ONLINE_SIGNEDIN, + MD_DEFAULT_CONTROLS_CONFIRM, + MD_AUTOSAVE_EXPLANATION, + MD_COMMENTARY_EXPLANATION, + MD_COMMENTARY_EXPLANATION_MULTI, + MD_COMMENTARY_CHAPTER_UNLOCK_EXPLANATION, + MD_SAVE_BEFORE_LANGUAGE_CHANGE, + MD_SAVE_BEFORE_NEW_GAME, + MD_SAVE_BEFORE_LOAD, + MD_DELETE_SAVE_CONFIRM, + MD_SAVE_OVERWRITE, + MD_SAVING_WARNING, + MD_SAVE_COMPLETE, + MD_STANDARD_SAMPLE, + MD_WARNING_SAMPLE, + MD_ERROR_SAMPLE, + MD_PROMPT_SIGNIN, + MD_PROMPT_SIGNIN_REQUIRED, + MD_PROMPT_STORAGE_DEVICE, + MD_PROMPT_STORAGE_DEVICE_REQUIRED, + MD_DISCONNECT_CONFIRMATION, + MD_DISCONNECT_CONFIRMATION_HOST, + MD_LOAD_FAILED_WARNING, + MD_OPTION_CHANGE_FROM_X360_DASHBOARD, + MD_STORAGE_DEVICES_CORRUPT, + MD_CHECKING_STORAGE_DEVICE +}; + +#include "vgui_controls/Frame.h" +#include "vgui_controls/Label.h" +#include "vgui_controls/AnimatingImagePanel.h" +#include "vgui_controls/ImagePanel.h" + +//----------------------------------------------------------------------------- +// Purpose: Simple modal dialog box for Xbox 360 warnings and messages +//----------------------------------------------------------------------------- +class CMessageDialog : public vgui::Frame +{ + DECLARE_CLASS_SIMPLE( CMessageDialog, vgui::Frame ); + +public: + CMessageDialog( vgui::Panel *parent, const uint nType, const char *pTitle, const char *pMsg, const char *pCmdA, const char *pCmdB, vgui::Panel *pParent, bool bShowActivity ); + ~CMessageDialog(); + + enum + { + BTN_INVALID = -1, + BTN_B, + BTN_A, + MAX_BUTTONS, + }; + + struct ButtonLabel_s + { + vgui::Label *pIcon; + vgui::Label *pText; + int nWide; + bool bCreated; + }; + + virtual void OnKeyCodePressed( vgui::KeyCode code ); + virtual void ApplySchemeSettings( vgui::IScheme *pScheme ); + virtual void ApplySettings( KeyValues *inResourceData ); + virtual void PaintBackground(); + uint GetType( void ); + void SetControlSettingsKeys( KeyValues *pKeys ); + +private: + void CreateButtonLabel( ButtonLabel_s *pButton, const char *pIcon, const char *pText ); + void DoCommand( int button ); + + vgui::Panel *m_pCreator; + + vgui::Label *m_pTitle; + vgui::Label *m_pMsg; + vgui::ImagePanel *m_pBackground; + + vgui::AnimatingImagePanel *m_pAnimatingPanel; + + vgui::HFont m_hButtonFont; + vgui::HFont m_hTextFont; + uint m_nType; + Color m_ButtonTextColor; + int m_ButtonPressed; + KeyValues *m_pControlSettings; + + int m_FooterTall; + int m_ButtonMargin; + Color m_clrNotSimpleBG; + Color m_clrNotSimpleBGBlack; + int m_ButtonIconLabelSpace; + + int m_ActivityIndent; + + bool m_bShowActivity; // should we show an animating image panel? + + ButtonLabel_s m_Buttons[MAX_BUTTONS]; + char *m_pCommands[MAX_BUTTONS]; +}; + +#endif // MESSAGEDIALOG_H diff --git a/public/vgui_controls/MessageMap.h b/public/vgui_controls/MessageMap.h new file mode 100644 index 0000000..226c0ad --- /dev/null +++ b/public/vgui_controls/MessageMap.h @@ -0,0 +1,381 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef MESSAGEMAP_H +#define MESSAGEMAP_H + +#ifdef _WIN32 +#pragma once +#endif + +#include "tier1/utlvector.h" + +// more flexible than default pointers to members code required for casting member function pointers +//#pragma pointers_to_members( full_generality, virtual_inheritance ) + +namespace vgui +{ + +////////////// MESSAGEMAP DEFINITIONS ////////////// + + +//----------------------------------------------------------------------------- +// Purpose: parameter data type enumeration +// used internal but the shortcut macros require this to be exposed +//----------------------------------------------------------------------------- +enum DataType_t +{ + DATATYPE_VOID, + DATATYPE_CONSTCHARPTR, + DATATYPE_INT, + DATATYPE_FLOAT, + DATATYPE_PTR, + DATATYPE_BOOL, + DATATYPE_KEYVALUES, + DATATYPE_CONSTWCHARPTR, + DATATYPE_UINT64, + DATATYPE_HANDLE, // It's an int, really +}; + +#ifdef WIN32 +class __virtual_inheritance Panel; +#else +class Panel; +#endif +typedef unsigned int VPANEL; + +typedef void (Panel::*MessageFunc_t)(void); + +//----------------------------------------------------------------------------- +// Purpose: Single item in a message map +// Contains the information to map a string message name with parameters +// to a function call +//----------------------------------------------------------------------------- +#pragma warning(disable:4121) +struct MessageMapItem_t +{ + const char *name; + // VC6 aligns this to 16-bytes. Since some of the code has been compiled with VC6, + // we need to enforce the alignment on later compilers to remain compatible. + ALIGN16 MessageFunc_t func; + + int numParams; + + DataType_t firstParamType; + const char *firstParamName; + + DataType_t secondParamType; + const char *secondParamName; + + int nameSymbol; + int firstParamSymbol; + int secondParamSymbol; +}; + +#define DECLARE_PANELMESSAGEMAP( className ) \ + static void AddToMap( char const *scriptname, vgui::MessageFunc_t function, int paramCount, int p1type, const char *p1name, int p2type, const char *p2name ) \ + { \ + vgui::PanelMessageMap *map = vgui::FindOrAddPanelMessageMap( GetPanelClassName() ); \ + \ + vgui::MessageMapItem_t entry; \ + entry.name = scriptname; \ + entry.func = function; \ + entry.numParams = paramCount; \ + entry.firstParamType = (vgui::DataType_t)p1type; \ + entry.firstParamName = p1name; \ + entry.secondParamType = (vgui::DataType_t)p2type; \ + entry.secondParamName = p2name; \ + entry.nameSymbol = 0; \ + entry.firstParamSymbol = 0; \ + entry.secondParamSymbol = 0; \ + \ + map->entries.AddToTail( entry ); \ + } \ + \ + static void ChainToMap( void ) \ + { \ + static bool chained = false; \ + if ( chained ) \ + return; \ + chained = true; \ + vgui::PanelMessageMap *map = vgui::FindOrAddPanelMessageMap( GetPanelClassName() ); \ + map->pfnClassName = &GetPanelClassName; \ + if ( map && GetPanelBaseClassName() && GetPanelBaseClassName()[0] ) \ + { \ + map->baseMap = vgui::FindOrAddPanelMessageMap( GetPanelBaseClassName() ); \ + } \ + } \ + \ + class className##_RegisterMap; \ + friend class className##_RegisterMap; \ + class className##_RegisterMap \ + { \ + public: \ + className##_RegisterMap() \ + { \ + className::ChainToMap(); \ + } \ + }; \ + className##_RegisterMap m_RegisterClass; \ + \ + virtual vgui::PanelMessageMap *GetMessageMap() \ + { \ + static vgui::PanelMessageMap *s_pMap = vgui::FindOrAddPanelMessageMap( GetPanelClassName() ); \ + return s_pMap; \ + } + +#if !defined( _XBOX ) +#define VGUI_USEKEYBINDINGMAPS 1 +#endif + +#if defined( VGUI_USEKEYBINDINGMAPS ) + +#define DECLARE_CLASS_SIMPLE( className, baseClassName ) \ + typedef baseClassName BaseClass; \ + typedef className ThisClass; \ +public: \ + DECLARE_PANELMESSAGEMAP( className ); \ + DECLARE_PANELANIMATION( className ); \ + DECLARE_KEYBINDINGMAP( className ); \ + static char const *GetPanelClassName() { return #className; } \ + static char const *GetPanelBaseClassName() { return #baseClassName; } + +#define DECLARE_CLASS_SIMPLE_NOBASE( className ) \ + typedef className ThisClass; \ +public: \ + DECLARE_PANELMESSAGEMAP( className ); \ + DECLARE_PANELANIMATION( className ); \ + DECLARE_KEYBINDINGMAP( className ); \ + static char const *GetPanelClassName() { return #className; } \ + static char const *GetPanelBaseClassName() { return NULL; } + +#else // no keybinding maps + +#define DECLARE_CLASS_SIMPLE( className, baseClassName ) \ + typedef baseClassName BaseClass; \ + typedef className ThisClass; \ +public: \ + DECLARE_PANELMESSAGEMAP( className ); \ + DECLARE_PANELANIMATION( className ); \ + static char const *GetPanelClassName() { return #className; } \ + static char const *GetPanelBaseClassName() { return #baseClassName; } + +#define DECLARE_CLASS_SIMPLE_NOBASE( className ) \ + typedef className ThisClass; \ +public: \ + DECLARE_PANELMESSAGEMAP( className ); \ + DECLARE_PANELANIMATION( className ); \ + static char const *GetPanelClassName() { return #className; } \ + static char const *GetPanelBaseClassName() { return NULL; } + +#endif // !VGUI_USEKEYBINDINGMAPS + +#define _MessageFuncCommon( name, scriptname, paramCount, p1type, p1name, p2type, p2name ) \ + class PanelMessageFunc_##name; \ + friend class PanelMessageFunc_##name; \ + class PanelMessageFunc_##name \ + { \ + public: \ + static void InitVar() \ + { \ + static bool bAdded = false; \ + if ( !bAdded ) \ + { \ + bAdded = true; \ + AddToMap( scriptname, (vgui::MessageFunc_t)&ThisClass::name, paramCount, p1type, p1name, p2type, p2name ); \ + } \ + } \ + PanelMessageFunc_##name() \ + { \ + PanelMessageFunc_##name::InitVar(); \ + } \ + }; \ + PanelMessageFunc_##name m_##name##_register; \ + +// Use this macro to define a message mapped function +// must end with a semicolon ';', or with a function +// no parameter +#define MESSAGE_FUNC( name, scriptname ) _MessageFuncCommon( name, scriptname, 0, 0, 0, 0, 0 ); virtual void name( void ) + +// one parameter +#define MESSAGE_FUNC_INT( name, scriptname, p1 ) _MessageFuncCommon( name, scriptname, 1, vgui::DATATYPE_INT, #p1, 0, 0 ); virtual void name( int p1 ) +#define MESSAGE_FUNC_UINT64( name, scriptname, p1 ) _MessageFuncCommon( name, scriptname, 1, vgui::DATATYPE_UINT64, #p1, 0, 0 ); virtual void name( uint64 p1 ) +#define MESSAGE_FUNC_PTR( name, scriptname, p1 ) _MessageFuncCommon( name, scriptname, 1, vgui::DATATYPE_PTR, #p1, 0, 0 ); virtual void name( vgui::Panel *p1 ) +#define MESSAGE_FUNC_HANDLE( name, scriptname, p1 ) _MessageFuncCommon( name, scriptname, 1, vgui::DATATYPE_HANDLE, #p1, 0, 0 ); virtual void name( vgui::VPANEL p1 ) +#define MESSAGE_FUNC_ENUM( name, scriptname, t1, p1 ) _MessageFuncCommon( name, scriptname, 1, vgui::DATATYPE_INT, #p1, 0, 0 ); virtual void name( t1 p1 ) +#define MESSAGE_FUNC_FLOAT( name, scriptname, p1 ) _MessageFuncCommon( name, scriptname, 1, vgui::DATATYPE_FLOAT, #p1, 0, 0 ); virtual void name( float p1 ) +#define MESSAGE_FUNC_CHARPTR( name, scriptname, p1 ) _MessageFuncCommon( name, scriptname, 1, vgui::DATATYPE_CONSTCHARPTR, #p1, 0, 0 ); virtual void name( const char *p1 ) +#define MESSAGE_FUNC_WCHARPTR( name, scriptname, p1 ) _MessageFuncCommon( name, scriptname, 1, vgui::DATATYPE_CONSTWCHARPTR, #p1, 0, 0 ); virtual void name( const wchar_t *p1 ) + +// two parameters +#define MESSAGE_FUNC_INT_INT( name, scriptname, p1, p2 ) _MessageFuncCommon( name, scriptname, 2, vgui::DATATYPE_INT, #p1, vgui::DATATYPE_INT, #p2 ); virtual void name( int p1, int p2 ) +#define MESSAGE_FUNC_PTR_INT( name, scriptname, p1, p2 ) _MessageFuncCommon( name, scriptname, 2, vgui::DATATYPE_PTR, #p1, vgui::DATATYPE_INT, #p2 ); virtual void name( vgui::Panel *p1, int p2 ) +#define MESSAGE_FUNC_HANDLE_INT( name, scriptname, p1, p2 ) _MessageFuncCommon( name, scriptname, 2, vgui::DATATYPE_HANDLE, #p1, vgui::DATATYPE_INT, #p2 ); virtual void name( vgui::VPANEL p1, int p2 ) +#define MESSAGE_FUNC_ENUM_ENUM( name, scriptname, t1, p1, t2, p2 ) _MessageFuncCommon( name, scriptname, 2, vgui::DATATYPE_INT, #p1, vgui::DATATYPE_INT, #p2 ); virtual void name( t1 p1, t2 p2 ) +#define MESSAGE_FUNC_INT_CHARPTR( name, scriptname, p1, p2 ) _MessageFuncCommon( name, scriptname, 2, vgui::DATATYPE_INT, #p1, vgui::DATATYPE_CONSTCHARPTR, #p2 ); virtual void name( int p1, const char *p2 ) +#define MESSAGE_FUNC_PTR_CHARPTR( name, scriptname, p1, p2 ) _MessageFuncCommon( name, scriptname, 2, vgui::DATATYPE_PTR, #p1, vgui::DATATYPE_CONSTCHARPTR, #p2 ); virtual void name( vgui::Panel *p1, const char *p2 ) +#define MESSAGE_FUNC_HANDLE_CHARPTR( name, scriptname, p1, p2 ) _MessageFuncCommon( name, scriptname, 2, vgui::DATATYPE_HANDLE, #p1, vgui::DATATYPE_CONSTCHARPTR, #p2 ); virtual void name( vgui::VPANEL p1, const char *p2 ) +#define MESSAGE_FUNC_PTR_WCHARPTR( name, scriptname, p1, p2 ) _MessageFuncCommon( name, scriptname, 2, vgui::DATATYPE_PTR, #p1, vgui::DATATYPE_CONSTWCHARPTR, #p2 ); virtual void name( vgui::Panel *p1, const wchar_t *p2 ) +#define MESSAGE_FUNC_HANDLE_WCHARPTR( name, scriptname, p1, p2 ) _MessageFuncCommon( name, scriptname, 2, vgui::DATATYPE_HANDLE, #p1, vgui::DATATYPE_CONSTWCHARPTR, #p2 ); virtual void name( vgui::VPANEL p1, const wchar_t *p2 ) +#define MESSAGE_FUNC_CHARPTR_CHARPTR( name, scriptname, p1, p2 ) _MessageFuncCommon( name, scriptname, 2, vgui::DATATYPE_CONSTCHARPTR, #p1, vgui::DATATYPE_CONSTCHARPTR, #p2 ); virtual void name( const char *p1, const char *p2 ) + +// unlimited parameters (passed in the whole KeyValues) +#define MESSAGE_FUNC_PARAMS( name, scriptname, p1 ) _MessageFuncCommon( name, scriptname, 1, vgui::DATATYPE_KEYVALUES, NULL, 0, 0 ); virtual void name( KeyValues *p1 ) + +// no-virtual function version +#define MESSAGE_FUNC_NV( name, scriptname ) _MessageFuncCommon( name, scriptname, 0, 0, 0, 0, 0 ); void name( void ) +#define MESSAGE_FUNC_NV_INT( name, scriptname, p1 ) _MessageFuncCommon( name, scriptname, 1, vgui::DATATYPE_INT, #p1, 0, 0 ); void name( int p1 ) +#define MESSAGE_FUNC_NV_INT_INT( name, scriptname, p1, p2 ) _MessageFuncCommon( name, scriptname, 2, vgui::DATATYPE_INT, #p1, vgui::DATATYPE_INT, #p2 ); void name( int p1, int p2 ) + + +// mapping, one per class +struct PanelMessageMap +{ + PanelMessageMap() + { + baseMap = NULL; + pfnClassName = NULL; + processed = false; + } + + CUtlVector< MessageMapItem_t > entries; + bool processed; + PanelMessageMap *baseMap; + char const *(*pfnClassName)( void ); +}; + +PanelMessageMap *FindPanelMessageMap( char const *className ); +PanelMessageMap *FindOrAddPanelMessageMap( char const *className ); + + + +/////////////////////////////////////////////////////////////////////////////////////////////////////////// +// +// OBSELETE MAPPING FUNCTIONS, USE ABOVE +// +/////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// no parameters +#define MAP_MESSAGE( type, name, func ) { name, (vgui::MessageFunc_t)(&type::func), 0 } + +// implicit single parameter (params is the data store) +#define MAP_MESSAGE_PARAMS( type, name, func ) { name, (vgui::MessageFunc_t)(&type::func), 1, vgui::DATATYPE_KEYVALUES, NULL } + +// single parameter +#define MAP_MESSAGE_PTR( type, name, func, param1 ) { name, (vgui::MessageFunc_t)(&type::func), 1, vgui::DATATYPE_PTR, param1 } +#define MAP_MESSAGE_INT( type, name, func, param1 ) { name, (vgui::MessageFunc_t)(&type::func), 1, vgui::DATATYPE_INT, param1 } +#define MAP_MESSAGE_BOOL( type, name, func, param1 ) { name, (vgui::MessageFunc_t)(&type::func), 1, vgui::DATATYPE_BOOL, param1 } +#define MAP_MESSAGE_FLOAT( type, name, func, param1 ) { name, (vgui::MessageFunc_t)(&type::func), 1, vgui::DATATYPE_FLOAT, param1 } +#define MAP_MESSAGE_PTR( type, name, func, param1 ) { name, (vgui::MessageFunc_t)(&type::func), 1, vgui::DATATYPE_PTR, param1 } +#define MAP_MESSAGE_CONSTCHARPTR( type, name, func, param1) { name, (vgui::MessageFunc_t)(&type::func), 1, vgui::DATATYPE_CONSTCHARPTR, param1 } +#define MAP_MESSAGE_CONSTWCHARPTR( type, name, func, param1) { name, (vgui::MessageFunc_t)(&type::func), 1, vgui::DATATYPE_CONSTWCHARPTR, param1 } + +// two parameters +#define MAP_MESSAGE_INT_INT( type, name, func, param1, param2 ) { name, (vgui::MessageFunc_t)&type::func, 2, vgui::DATATYPE_INT, param1, vgui::DATATYPE_INT, param2 } +#define MAP_MESSAGE_PTR_INT( type, name, func, param1, param2 ) { name, (vgui::MessageFunc_t)&type::func, 2, vgui::DATATYPE_PTR, param1, vgui::DATATYPE_INT, param2 } +#define MAP_MESSAGE_INT_CONSTCHARPTR( type, name, func, param1, param2 ) { name, (vgui::MessageFunc_t)&type::func, 2, vgui::DATATYPE_INT, param1, vgui::DATATYPE_CONSTCHARPTR, param2 } +#define MAP_MESSAGE_PTR_CONSTCHARPTR( type, name, func, param1, param2 ) { name, (vgui::MessageFunc_t)&type::func, 2, vgui::DATATYPE_PTR, param1, vgui::DATATYPE_CONSTCHARPTR, param2 } +#define MAP_MESSAGE_PTR_CONSTWCHARPTR( type, name, func, param1, param2 ) { name, (vgui::MessageFunc_t)&type::func, 2, vgui::DATATYPE_PTR, param1, vgui::DATATYPE_CONSTWCHARPTR, param2 } +#define MAP_MESSAGE_CONSTCHARPTR_CONSTCHARPTR( type, name, func, param1, param2 ) { name, (vgui::MessageFunc_t)&type::func, 2, vgui::DATATYPE_CONSTCHARPTR, param1, vgui::DATATYPE_CONSTCHARPTR, param2 } + +// if more parameters are needed, just use MAP_MESSAGE_PARAMS() and pass the keyvalue set into the function + +//----------------------------------------------------------------------------- +// Purpose: stores the list of objects in the hierarchy +// used to iterate through an object's message maps +//----------------------------------------------------------------------------- +struct PanelMap_t +{ + MessageMapItem_t *dataDesc; + int dataNumFields; + const char *dataClassName; + PanelMap_t *baseMap; + int processed; +}; + +// for use in class declarations +// declares the static variables and functions needed for the data description iteration +#define DECLARE_PANELMAP() \ + static vgui::PanelMap_t m_PanelMap; \ + static vgui::MessageMapItem_t m_MessageMap[]; \ + virtual vgui::PanelMap_t *GetPanelMap( void ); + +// could embed typeid() into here as well? +#define IMPLEMENT_PANELMAP( derivedClass, baseClass ) \ + vgui::PanelMap_t derivedClass::m_PanelMap = { derivedClass::m_MessageMap, ARRAYSIZE(derivedClass::m_MessageMap), #derivedClass, &baseClass::m_PanelMap }; \ + vgui::PanelMap_t *derivedClass::GetPanelMap( void ) { return &m_PanelMap; } + +typedef vgui::Panel *( *PANELCREATEFUNC )( void ); + +//----------------------------------------------------------------------------- +// Purpose: Used by DECLARE_BUILD_FACTORY macro to create a linked list of +// instancing functions +//----------------------------------------------------------------------------- +class CBuildFactoryHelper +{ +public: + // Static list of helpers + static CBuildFactoryHelper *m_sHelpers; + +public: + // Construction + CBuildFactoryHelper( char const *className, PANELCREATEFUNC func ); + + // Accessors + CBuildFactoryHelper *GetNext( void ); + + char const *GetClassName() const; + + vgui::Panel *CreatePanel(); + + static vgui::Panel *InstancePanel( char const *className ); + static void GetFactoryNames( CUtlVector< char const * >& list ); +private: + + static bool HasFactory( char const *className ); + + // Next factory in list + CBuildFactoryHelper *m_pNext; + + int m_Type; + PANELCREATEFUNC m_CreateFunc; + char const *m_pClassName; +}; + +// This is the macro which implements creation of each type of panel +// It creates a function which instances an object of the specified type +// It them hooks that function up to the helper list so that the CHud objects can create +// the elements by name, with no header file dependency, etc. +#define DECLARE_BUILD_FACTORY( className ) \ + static vgui::Panel *Create_##className( void ) \ + { \ + return new className( NULL, NULL ); \ + }; \ + static vgui::CBuildFactoryHelper g_##className##_Helper( #className, Create_##className );\ + className *g_##className##LinkerHack = NULL; + +#define DECLARE_BUILD_FACTORY_DEFAULT_TEXT( className, defaultText ) \ + static vgui::Panel *Create_##className( void ) \ + { \ + return new className( NULL, NULL, #defaultText ); \ + }; \ + static vgui::CBuildFactoryHelper g_##className##_Helper( #className, Create_##className );\ + className *g_##className##LinkerHack = NULL; + +// This one allows passing in a special function with calls new panel( xxx ) with arbitrary default parameters +#define DECLARE_BUILD_FACTORY_CUSTOM( className, createFunc ) \ + static vgui::CBuildFactoryHelper g_##className##_Helper( #className, createFunc );\ + className *g_##className##LinkerHack = NULL; + +#define DECLARE_BUILD_FACTORY_CUSTOM_ALIAS( className, factoryName, createFunc ) \ + static vgui::CBuildFactoryHelper g_##factoryName##_Helper( #factoryName, createFunc );\ + className *g_##factoryName##LinkerHack = NULL; + +} // namespace vgui + + +#endif // MESSAGEMAP_H diff --git a/public/vgui_controls/PHandle.h b/public/vgui_controls/PHandle.h new file mode 100644 index 0000000..959ee4a --- /dev/null +++ b/public/vgui_controls/PHandle.h @@ -0,0 +1,86 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef PHANDLE_H +#define PHANDLE_H + +#ifdef _WIN32 +#pragma once +#endif + +#include <vgui/VGUI.h> + +namespace vgui +{ + +class Panel; + +//----------------------------------------------------------------------------- +// Purpose: Safe pointer class for handling Panel or derived panel classes +//----------------------------------------------------------------------------- +class PHandle +{ +public: + PHandle() : m_iPanelID(INVALID_PANEL) {} //m_iSerialNumber(0), m_pListEntry(0) {} + + Panel *Get(); + Panel *Set( Panel *pPanel ); + Panel *Set( HPanel hPanel ); + + operator Panel *() { return Get(); } + Panel * operator ->() { return Get(); } + Panel * operator = (Panel *pPanel) { return Set(pPanel); } + + bool operator == (Panel *pPanel) { return (Get() == pPanel); } + operator bool () { return Get() != 0; } + +private: + HPanel m_iPanelID; +}; + +//----------------------------------------------------------------------------- +// Purpose: Safe pointer class to just convert between VPANEL's and PHandle +//----------------------------------------------------------------------------- +class VPanelHandle +{ +public: + VPanelHandle() : m_iPanelID(INVALID_PANEL) {} + + VPANEL Get(); + VPANEL Set( VPANEL pPanel ); + + operator VPANEL () { return Get(); } + VPANEL operator = (VPANEL pPanel) { return Set(pPanel); } + + bool operator == (VPANEL pPanel) { return (Get() == pPanel); } + operator bool () { return Get() != 0; } + +private: + HPanel m_iPanelID; +}; + +//----------------------------------------------------------------------------- +// Purpose: DHANDLE is a templated version of PHandle +//----------------------------------------------------------------------------- +template< class PanelType > +class DHANDLE : public PHandle +{ +public: + PanelType *Get() { return (PanelType *)PHandle::Get(); } + PanelType *Set( PanelType *pPanel ) { return (PanelType *)PHandle::Set(pPanel); } + PanelType *Set( HPanel hPanel ) { return (PanelType *)PHandle::Set(hPanel); } + + operator PanelType *() { return (PanelType *)PHandle::Get(); } + PanelType * operator ->() { return (PanelType *)PHandle::Get(); } + PanelType * operator = (PanelType *pPanel) { return (PanelType *)PHandle::Set(pPanel); } + bool operator == (Panel *pPanel) { return (PHandle::Get() == pPanel); } + operator bool () { return PHandle::Get() != NULL; } +}; + +}; + +#endif // PHANDLE_H diff --git a/public/vgui_controls/Panel.h b/public/vgui_controls/Panel.h new file mode 100644 index 0000000..5d1abd1 --- /dev/null +++ b/public/vgui_controls/Panel.h @@ -0,0 +1,1041 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//===========================================================================// + +#ifndef PANEL_H +#define PANEL_H + +#ifdef _WIN32 +#pragma once +#endif + +#include "tier1/utlflags.h" +#include "vgui/VGUI.h" +#include "vgui/Dar.h" +#include "vgui_controls/MessageMap.h" +#if defined( VGUI_USEKEYBINDINGMAPS ) +#include "vgui_controls/KeyBindingMap.h" +#endif +#include "vgui/IClientPanel.h" +#include "vgui/IScheme.h" +#include "vgui_controls/Controls.h" +#include "vgui_controls/PHandle.h" +#include "vgui_controls/PanelAnimationVar.h" +#include "Color.h" +#include "vstdlib/IKeyValuesSystem.h" +#include "tier1/utlsymbol.h" +#include "vgui_controls/BuildGroup.h" + +// undefine windows function macros that overlap +#ifdef PostMessage +#undef PostMessage +#endif + +#ifdef SetCursor +#undef SetCursor +#endif + +class CUtlBuffer; + +namespace vgui +{ + +#if !defined( _X360 ) +#define VGUI_USEDRAGDROP 1 +#endif + +#if defined( VGUI_USEKEYBINDINGMAPS ) +struct PanelKeyBindingMap; +#endif +//----------------------------------------------------------------------------- +// Purpose: Helper functions to construct vgui panels +// +// SETUP_PANEL - will make a panel ready for use right now (i.e setup its colors, borders, fonts, etc) +// +template< class T > +inline T *SETUP_PANEL(T *panel) +{ + panel->MakeReadyForUse(); + return panel; +} + +// +// CREATE_PANEL - creates a panel that is ready to use right now +// +// example of use = to set the FG Color of a panel inside of a constructor (i.e before ApplySchemeSettings() has been run on the child) +// +#define CREATE_PANEL(type, parent, name) (SETUP_PANEL(new type(parent, name))) + +//----------------------------------------------------------------------------- +// Purpose: Drag/drop support context info (could defined within Panel...) +//----------------------------------------------------------------------------- +#if defined( VGUI_USEDRAGDROP ) +struct DragDrop_t; +class Menu; +#endif + +//----------------------------------------------------------------------------- +// Purpose: Macro to handle Colors that can be overridden in .res files +//----------------------------------------------------------------------------- +struct OverridableColorEntry +{ + char const *name() { return m_pszScriptName; } + + char const *m_pszScriptName; + Color *m_pColor; + Color m_colFromScript; + bool m_bOverridden; +}; + +#define REGISTER_COLOR_AS_OVERRIDABLE( name, scriptname ) \ + AddToOverridableColors( &name, scriptname ); + + + +//----------------------------------------------------------------------------- +// Purpose: For hudanimations.txt scripting of vars +//----------------------------------------------------------------------------- +class IPanelAnimationPropertyConverter +{ +public: + virtual void GetData( Panel *panel, KeyValues *kv, PanelAnimationMapEntry *entry ) = 0; + virtual void SetData( Panel *panel, KeyValues *kv, PanelAnimationMapEntry *entry ) = 0; + virtual void InitFromDefault( Panel *panel, PanelAnimationMapEntry *entry ) = 0; +}; + +#if defined( VGUI_USEKEYBINDINGMAPS ) +enum KeyBindingContextHandle_t +{ + INVALID_KEYBINDINGCONTEXT_HANDLE = 0xffffffff, +}; +#endif + +class IForceVirtualInheritancePanel +{ + // We need Panel to use virtual inheritance so that + // pointers to its members are max size. + // This is due to a limitation in C++ with ahead + // declarations of points to members as used in MessageMap. +}; + +//============================================================================= +// HPE_BEGIN: +// [tj] bitwise defines for rounded corners +//============================================================================= +#define PANEL_ROUND_CORNER_TOP_LEFT (1 << 0) +#define PANEL_ROUND_CORNER_TOP_RIGHT (1 << 1) +#define PANEL_ROUND_CORNER_BOTTOM_LEFT (1 << 2) +#define PANEL_ROUND_CORNER_BOTTOM_RIGHT (1 << 3) +#define PANEL_ROUND_CORNER_ALL PANEL_ROUND_CORNER_TOP_LEFT | PANEL_ROUND_CORNER_TOP_RIGHT | PANEL_ROUND_CORNER_BOTTOM_LEFT | PANEL_ROUND_CORNER_BOTTOM_RIGHT +//============================================================================= +// HPE_END +//=============================================================================//----------------------------------------------------------------------------- +// Purpose: Base interface to all vgui windows +// All vgui controls that receive message and/or have a physical presence +// on screen are be derived from Panel. +// This is designed as an easy-access to the vgui-functionality; for more +// low-level access to vgui functions use the IPanel/IClientPanel interfaces directly +//----------------------------------------------------------------------------- +class Panel : public IClientPanel, virtual public IForceVirtualInheritancePanel +{ + DECLARE_CLASS_SIMPLE_NOBASE( Panel ); + +public: + // For property mapping + static void InitPropertyConverters( void ); + static void AddPropertyConverter( char const *typeName, IPanelAnimationPropertyConverter *converter ); + + //----------------------------------------------------------------------------- + // CONSTRUCTORS + // these functions deal with the creation of the Panel + // the Panel automatically gets a handle to a vgui-internal panel, the ipanel(), upon construction + // vgui interfaces deal only with ipanel(), not Panel directly + Panel(); + Panel(Panel *parent); + Panel(Panel *parent, const char *panelName); + Panel(Panel *parent, const char *panelName, HScheme scheme); + + virtual ~Panel(); + + // returns pointer to Panel's vgui VPanel interface handle + virtual VPANEL GetVPanel() { return _vpanel; } + VPANEL GetVPanel() const { return _vpanel; } + HPanel ToHandle() const; + + virtual void Init( int x, int y, int wide, int tall ); + + //----------------------------------------------------------------------------- + // PANEL METHODS + // these functions all manipulate panels + // they cannot be derived from + void SetName(const char *panelName); // sets the name of the panel - used as an identifier + const char *GetName(); // returns the name of this panel... never NULL + const char *GetClassName(); // returns the class name of the panel (eg. Panel, Label, Button, etc.) + + void MakeReadyForUse(); // fully construct this panel so its ready for use right now (i.e fonts loaded, colors set, default label text set, ...) + + // panel position & size + // all units are in pixels + void SetPos(int x,int y); // sets position of panel, in local space (ie. relative to parent's position) + void GetPos(int &x,int &y); // gets local position of panel + int GetXPos(); + int GetYPos(); + void SetSize(int wide,int tall); // sets size of panel + void GetSize(int &wide, int &tall); // gets size of panel + void SetBounds(int x, int y, int wide, int tall); // combination of SetPos/SetSize + void GetBounds(int &x, int &y, int &wide, int &tall); // combination of GetPos/GetSize + int GetWide(); // returns width of panel + void SetWide(int wide); // sets width of panel + int GetTall(); // returns height of panel + void SetTall(int tall); // sets height of panel + void SetMinimumSize(int wide,int tall); // sets the minimum size the panel can go + void GetMinimumSize(int& wide,int& tall); // gets the minimum size + bool IsBuildModeEditable(); // editable in the buildModeDialog? + void SetBuildModeEditable(bool state); // set buildModeDialog editable + bool IsBuildModeDeletable(); // deletable in the buildModeDialog? + void SetBuildModeDeletable(bool state); // set buildModeDialog deletable + bool IsBuildModeActive(); // true if we're currently in edit mode + void SetZPos(int z); // sets Z ordering - lower numbers are always behind higher z's + int GetZPos( void ) const; + void SetAlpha(int alpha); // sets alpha modifier for panel and all child panels [0..255] + int GetAlpha(); // returns the current alpha + + // panel visibility + // invisible panels and their children do not drawn, updated, or receive input messages + virtual void SetVisible(bool state); + virtual bool IsVisible(); + + // painting + virtual VPANEL IsWithinTraverse(int x, int y, bool traversePopups); // recursive; returns a pointer to the panel at those coordinates + MESSAGE_FUNC( Repaint, "Repaint" ); // marks the panel as needing to be repainted + virtual void PostMessage(VPANEL target, KeyValues *message, float delaySeconds = 0.0f); + + bool IsWithin(int x, int y); //in screen space + void LocalToScreen(int &x, int &y); + void ScreenToLocal(int &x, int &y); + void ParentLocalToScreen(int &x, int &y); + void MakePopup(bool showTaskbarIcon = true,bool disabled = false); // turns the panel into a popup window (ie. can draw outside of it's parents space) + virtual void OnMove(); + + // panel hierarchy + virtual Panel *GetParent(); + virtual VPANEL GetVParent(); + virtual void SetParent(Panel *newParent); + virtual void SetParent(VPANEL newParent); + virtual bool HasParent(VPANEL potentialParent); + + int GetChildCount(); + Panel *GetChild(int index); + virtual CUtlVector< VPANEL > &GetChildren(); + int FindChildIndexByName( const char *childName ); + Panel *FindChildByName(const char *childName, bool recurseDown = false); + Panel *FindSiblingByName(const char *siblingName); + void CallParentFunction(KeyValues *message); + + template < class T > + T *FindControl( const char *pszName, bool recurseDown = false ) { return dynamic_cast<T *>( FindChildByName( pszName, recurseDown ) ); } + + virtual void SetAutoDelete(bool state); // if set to true, panel automatically frees itself when parent is deleted + virtual bool IsAutoDeleteSet(); + virtual void DeletePanel(); // simply does a { delete this; } + + // messaging + virtual void AddActionSignalTarget(Panel *messageTarget); + virtual void AddActionSignalTarget(VPANEL messageTarget); + virtual void RemoveActionSignalTarget(Panel *oldTarget); + virtual void PostActionSignal(KeyValues *message); // sends a message to the current actionSignalTarget(s) + virtual bool RequestInfoFromChild(const char *childName, KeyValues *outputData); + virtual void PostMessageToChild(const char *childName, KeyValues *messsage); + virtual void PostMessage(Panel *target, KeyValues *message, float delaySeconds = 0.0f); + virtual bool RequestInfo(KeyValues *outputData); // returns true if output is successfully written. You should always chain back to the base class if info request is not handled + virtual bool SetInfo(KeyValues *inputData); // sets a specified value in the control - inverse of the above + virtual void SetSilentMode( bool bSilent ); //change the panel's silent mode; if silent, the panel will not post any action signals + + // install a mouse handler + virtual void InstallMouseHandler( Panel *pHandler ); // mouse events will be send to handler panel instead of this panel + + // drawing state + virtual void SetEnabled(bool state); + virtual bool IsEnabled(); + virtual bool IsPopup(); // has a parent, but is in it's own space + virtual void GetClipRect(int &x0, int &y0, int &x1, int &y1); + virtual void MoveToFront(); + + // pin positions for auto-layout + enum PinCorner_e + { + PIN_TOPLEFT = 0, + PIN_TOPRIGHT, + PIN_BOTTOMLEFT, + PIN_BOTTOMRIGHT, + + // For sibling pinning + PIN_CENTER_TOP, + PIN_CENTER_RIGHT, + PIN_CENTER_BOTTOM, + PIN_CENTER_LEFT, + + PIN_LAST + }; + + // specifies the auto-resize directions for the panel + enum AutoResize_e + { + AUTORESIZE_NO = 0, + AUTORESIZE_RIGHT, + AUTORESIZE_DOWN, + AUTORESIZE_DOWNANDRIGHT, + }; + + // Sets the pin corner for non-resizing panels + void SetPinCorner( PinCorner_e pinCorner, int nOffsetX, int nOffsetY ); + + // Sets the pin corner + resize mode for resizing panels + void SetAutoResize( PinCorner_e pinCorner, AutoResize_e resizeDir, int nPinOffsetX, int nPinOffsetY, int nUnpinnedCornerOffsetX, int nUnpinnedCornerOffsetY ); + + AutoResize_e GetAutoResize(); + PinCorner_e GetPinCorner(); + + // Gets the relative offset of the control from the pinned + non-pinned corner (for resizing) + void GetPinOffset( int &dx, int &dy ); + void GetResizeOffset( int &dx, int &dy ); + + void PinToSibling( const char *pszSibling, PinCorner_e pinOurCorner, PinCorner_e pinSibling ); + void UpdateSiblingPin( void ); + + // colors + virtual void SetBgColor(Color color); + virtual void SetFgColor(Color color); + virtual Color GetBgColor(); + virtual Color GetFgColor(); + + virtual void SetCursor(HCursor cursor); + virtual HCursor GetCursor(); + virtual void SetCursorAlwaysVisible( bool visible ); + virtual void RequestFocus(int direction = 0); + virtual bool HasFocus(); + virtual void InvalidateLayout(bool layoutNow = false, bool reloadScheme = false); + virtual bool RequestFocusPrev(VPANEL panel = NULL); + virtual bool RequestFocusNext(VPANEL panel = NULL); + // tab positioning + virtual void SetTabPosition(int position); + virtual int GetTabPosition(); + // border + virtual void SetBorder(IBorder *border); + virtual IBorder *GetBorder(); + virtual void SetPaintBorderEnabled(bool state); + virtual void SetPaintBackgroundEnabled(bool state); + virtual void SetPaintEnabled(bool state); + virtual void SetPostChildPaintEnabled(bool state); + virtual void SetPaintBackgroundType(int type); // 0 for normal(opaque), 1 for single texture from Texture1, and 2 for rounded box w/ four corner textures + virtual void GetInset(int &left, int &top, int &right, int &bottom); + virtual void GetPaintSize(int &wide, int &tall); + virtual void SetBuildGroup(BuildGroup *buildGroup); + virtual bool IsBuildGroupEnabled(); + virtual bool IsCursorNone(); + virtual bool IsCursorOver(); // returns true if the cursor is currently over the panel + virtual void MarkForDeletion(); // object will free it's memory next tick + virtual bool IsLayoutInvalid(); // does this object require a perform layout? + virtual Panel *HasHotkey(wchar_t key); // returns the panel that has this hotkey + virtual bool IsOpaque(); + bool IsRightAligned(); // returns true if the settings are aligned to the right of the screen + bool IsBottomAligned(); // returns true if the settings are aligned to the bottom of the screen + + // scheme access functions + virtual HScheme GetScheme(); + virtual void SetScheme(const char *tag); + virtual void SetScheme(HScheme scheme); + virtual Color GetSchemeColor(const char *keyName,IScheme *pScheme); + virtual Color GetSchemeColor(const char *keyName, Color defaultColor,IScheme *pScheme); + + // called when scheme settings need to be applied; called the first time before the panel is painted + virtual void ApplySchemeSettings(IScheme *pScheme); + + // interface to build settings + // takes a group of settings and applies them to the control + virtual void ApplySettings(KeyValues *inResourceData); + + // records the settings into the resource data + virtual void GetSettings(KeyValues *outResourceData); + + // gets a description of the resource for use in the UI + // format: <type><whitespace | punctuation><keyname><whitespace| punctuation><type><whitespace | punctuation><keyname>... + // unknown types as just displayed as strings in the UI (for future UI expansion) + virtual const char *GetDescription(); + + // returns the name of the module that this instance of panel was compiled into + virtual const char *GetModuleName(); + + // user configuration settings + // this is used for any control details the user wants saved between sessions + // eg. dialog positions, last directory opened, list column width + virtual void ApplyUserConfigSettings(KeyValues *userConfig); + + // returns user config settings for this control + virtual void GetUserConfigSettings(KeyValues *userConfig); + + // optimization, return true if this control has any user config settings + virtual bool HasUserConfigSettings(); + + // message handlers + // override to get access to the message + // override to get access to the message + virtual void OnMessage(const KeyValues *params, VPANEL fromPanel); // called when panel receives message; must chain back + MESSAGE_FUNC_CHARPTR( OnCommand, "Command", command ); // called when a panel receives a command + MESSAGE_FUNC( OnMouseCaptureLost, "MouseCaptureLost" ); // called after the panel loses mouse capture + MESSAGE_FUNC( OnSetFocus, "SetFocus" ); // called after the panel receives the keyboard focus + MESSAGE_FUNC( OnKillFocus, "KillFocus" ); // called after the panel loses the keyboard focus + MESSAGE_FUNC( OnDelete, "Delete" ); // called to delete the panel; Panel::OnDelete() does simply { delete this; } + virtual void OnThink(); // called every frame before painting, but only if panel is visible + virtual void OnChildAdded(VPANEL child); // called when a child has been added to this panel + virtual void OnSizeChanged(int newWide, int newTall); // called after the size of a panel has been changed + + // called every frame if ivgui()->AddTickSignal() is called + virtual void OnTick(); + + // input messages + MESSAGE_FUNC_INT_INT( OnCursorMoved, "OnCursorMoved", x, y ); + virtual void OnCursorEntered(); + virtual void OnCursorExited(); + virtual void OnMousePressed(MouseCode code); + virtual void OnMouseDoublePressed(MouseCode code); + virtual void OnMouseReleased(MouseCode code); + virtual void OnMouseMismatchedRelease( MouseCode code, Panel* pPressedPanel ); + virtual void OnMouseWheeled(int delta); + + // Trip pressing (e.g., select all text in a TextEntry) requires this to be enabled + virtual void SetTriplePressAllowed( bool state ); + virtual bool IsTriplePressAllowed() const; + virtual void OnMouseTriplePressed( MouseCode code ); + + static char const *KeyCodeToString( KeyCode code ); + static wchar_t const *KeyCodeToDisplayString( KeyCode code ); + static wchar_t const *KeyCodeModifiersToDisplayString( KeyCode code, int modifiers ); // L"Ctrl+Alt+Shift+Backspace" + + static KeyCode StringToKeyCode( char const *str ); +#if defined( VGUI_USEKEYBINDINGMAPS ) + static KeyBindingContextHandle_t CreateKeyBindingsContext( char const *filename, char const *pathID = 0 ); + virtual void SetKeyBindingsContext( KeyBindingContextHandle_t handle ); + virtual KeyBindingContextHandle_t GetKeyBindingsContext() const; + virtual bool IsValidKeyBindingsContext() const; + + static int GetPanelsWithKeyBindingsCount( KeyBindingContextHandle_t handle ); + static Panel *GetPanelWithKeyBindings( KeyBindingContextHandle_t handle, int index ); + + static void RevertKeyBindings( KeyBindingContextHandle_t handle ); + + static void ReloadKeyBindings( KeyBindingContextHandle_t handle ); + static void SaveKeyBindings( KeyBindingContextHandle_t handle ); + static void SaveKeyBindingsToFile( KeyBindingContextHandle_t handle, char const *filename, char const *pathID = 0 ); + static void LoadKeyBindings( KeyBindingContextHandle_t handle ); + static void LoadKeyBindingsForOnePanel( KeyBindingContextHandle_t handle, Panel *panelOfInterest ); + + // OnKeyCodeTyped hooks into here for action + virtual bool IsKeyRebound( KeyCode code, int modifiers ); + // If a panel implements this and returns true, then the IsKeyRebound check will fail and OnKeyCodeTyped messages will pass through.. + // sort of like setting the SetAllowKeyBindingChainToParent flag to false for specific keys + virtual bool IsKeyOverridden( KeyCode code, int modifiers ); + + virtual void AddKeyBinding( char const *bindingName, int keycode, int modifiers ); + + KeyBindingMap_t *LookupBinding( char const *bindingName ); + KeyBindingMap_t *LookupBindingByKeyCode( KeyCode code, int modifiers ); + void LookupBoundKeys( char const *bindingName, CUtlVector< BoundKey_t * >& list ); + BoundKey_t *LookupDefaultKey( char const *bindingName ); + PanelKeyBindingMap *LookupMapForBinding( char const *bindingName ); + + // Returns the number of keybindings + int GetKeyMappingCount( ); + + void RevertKeyBindingsToDefault(); + void RemoveAllKeyBindings(); + void ReloadKeyBindings(); + virtual void EditKeyBindings(); + + // calls RevertKeyBindingsToDefault() and then LoadKeyBindingsForOnePanel( GetKeyBindingsContext(), this ); + void SaveKeyBindingsToBuffer( int level, CUtlBuffer& buf ); + bool ParseKeyBindings( KeyValues *kv ); + + virtual char const *GetKeyBindingsFile() const; + virtual char const *GetKeyBindingsFilePathID() const; + + // Set this to false to disallow IsKeyRebound chaining to GetParent() Panels... + void SetAllowKeyBindingChainToParent( bool state ); + bool IsKeyBindingChainToParentAllowed() const; +#endif // VGUI_USEKEYBINDINGMAPS + + // base implementation forwards Key messages to the Panel's parent + // - override to 'swallow' the input + virtual void OnKeyCodePressed(KeyCode code); + virtual void OnKeyCodeTyped(KeyCode code); + virtual void OnKeyTyped(wchar_t unichar); + virtual void OnKeyCodeReleased(KeyCode code); + virtual void OnKeyFocusTicked(); // every window gets key ticked events + + // forwards mouse messages to the panel's parent + MESSAGE_FUNC( OnMouseFocusTicked, "OnMouseFocusTicked" ); + + // message handlers that don't go through the message pump + virtual void PaintBackground(); + virtual void Paint(); + virtual void PaintBorder(); + virtual void PaintBuildOverlay(); // the extra drawing for when in build mode + virtual void PostChildPaint(); + virtual void PerformLayout(); + + // this enables message mapping for this class - requires matching IMPLEMENT_PANELDESC() in the .cpp file + DECLARE_PANELMAP(); + + virtual VPANEL GetCurrentKeyFocus(); + + // returns a pointer to the tooltip object associated with the panel + // creates a new one if none yet exists + BaseTooltip *GetTooltip(); + void SetTooltip( BaseTooltip *pToolTip, const char *pszText ); + + /// Returns the effective tooltip text to use, whether stored + /// locally in this panel, or in the tooltip object. Returns + /// an empty string if no tooltip text + const char *GetEffectiveTooltipText() const; + + // proportional mode settings + virtual bool IsProportional() { return _flags.IsFlagSet( IS_PROPORTIONAL ); } + virtual void SetProportional(bool state); + + // input interest + virtual void SetMouseInputEnabled( bool state ); + virtual void SetKeyBoardInputEnabled( bool state ); + virtual bool IsMouseInputEnabled(); + virtual bool IsKeyBoardInputEnabled(); + + virtual void DrawTexturedBox( int x, int y, int wide, int tall, Color color, float normalizedAlpha ); + virtual void DrawBox(int x, int y, int wide, int tall, Color color, float normalizedAlpha, bool hollow = false ); + virtual void DrawBoxFade(int x, int y, int wide, int tall, Color color, float normalizedAlpha, unsigned int alpha0, unsigned int alpha1, bool bHorizontal, bool hollow = false ); + virtual void DrawHollowBox(int x, int y, int wide, int tall, Color color, float normalizedAlpha ); + //============================================================================= + // HPE_BEGIN: + //============================================================================= + + // [menglish] Draws a hollow box similar to the already existing draw hollow box function, but takes the indents as params + virtual void DrawHollowBox( int x, int y, int wide, int tall, Color color, float normalizedAlpha, int cornerWide, int cornerTall ); + + // [tj] Simple getters and setters to decide which corners to draw rounded + unsigned char GetRoundedCorners() { return m_roundedCorners; } + void SetRoundedCorners (unsigned char cornerFlags) { m_roundedCorners = cornerFlags; } + bool ShouldDrawTopLeftCornerRounded() { return ( m_roundedCorners & PANEL_ROUND_CORNER_TOP_LEFT ) != 0; } + bool ShouldDrawTopRightCornerRounded() { return ( m_roundedCorners & PANEL_ROUND_CORNER_TOP_RIGHT ) != 0; } + bool ShouldDrawBottomLeftCornerRounded() { return ( m_roundedCorners & PANEL_ROUND_CORNER_BOTTOM_LEFT ) != 0; } + bool ShouldDrawBottomRightCornerRounded() { return ( m_roundedCorners & PANEL_ROUND_CORNER_BOTTOM_RIGHT ) != 0; } + + //============================================================================= + // HPE_END + //============================================================================= + +// Drag Drop Public interface + + virtual void SetDragEnabled( bool enabled ); + virtual bool IsDragEnabled() const; + + virtual void SetShowDragHelper( bool enabled ); + + // Called if drag drop is started but not dropped on top of droppable panel... + virtual void OnDragFailed( CUtlVector< KeyValues * >& msglist ); + + // Use this to prevent chaining up from a parent which can mess with mouse functionality if you don't want to chain up from a child panel to the best + // draggable parent. + virtual void SetBlockDragChaining( bool block ); + virtual bool IsBlockingDragChaining() const; + + virtual int GetDragStartTolerance() const; + virtual void SetDragSTartTolerance( int nTolerance ); + + // If hover context time is non-zero, then after the drop cursor is hovering over the panel for that amount of time + // the Show hover context menu function will be invoked + virtual void SetDropEnabled( bool enabled, float m_flHoverContextTime = 0.0f ); + virtual bool IsDropEnabled() const; + + // Called if m_flHoverContextTime was non-zero, allows droppee to preview the drop data and show an appropriate menu + // Return false if not using context menu + virtual bool GetDropContextMenu( Menu *menu, CUtlVector< KeyValues * >& msglist ); + virtual void OnDropContextHoverShow( CUtlVector< KeyValues * >& msglist ); + virtual void OnDropContextHoverHide( CUtlVector< KeyValues * >& msglist ); + +#if defined( VGUI_USEDRAGDROP ) + virtual DragDrop_t *GetDragDropInfo(); +#endif + // For handling multiple selections... + virtual void OnGetAdditionalDragPanels( CUtlVector< Panel * >& dragabbles ); + + virtual void OnCreateDragData( KeyValues *msg ); + // Called to see if a drop enabled panel can accept the specified data blob + virtual bool IsDroppable( CUtlVector< KeyValues * >& msglist ); + + // Mouse is on draggable panel and has started moving, but is not over a droppable panel yet + virtual void OnDraggablePanelPaint(); + // Mouse is now over a droppable panel + virtual void OnDroppablePanelPaint( CUtlVector< KeyValues * >& msglist, CUtlVector< Panel * >& dragPanels ); + + virtual void OnPanelDropped( CUtlVector< KeyValues * >& msglist ); + + // called on droptarget when draggable panel entered/exited droptarget + virtual void OnPanelEnteredDroppablePanel( CUtlVector< KeyValues * >& msglist ); + virtual void OnPanelExitedDroppablePanel ( CUtlVector< KeyValues * >& msglist ); + + // Chains up to any parent marked DropEnabled + virtual Panel *GetDropTarget( CUtlVector< KeyValues * >& msglist ); + // Chains up to first parent marked DragEnabled + virtual Panel *GetDragPanel(); + virtual bool IsBeingDragged(); + virtual HCursor GetDropCursor( CUtlVector< KeyValues * >& msglist ); + + Color GetDropFrameColor(); + Color GetDragFrameColor(); + + // Can override to require custom behavior to start the drag state + virtual bool CanStartDragging( int startx, int starty, int mx, int my ); + + // Draws a filled rect of specified bounds, but omits the bounds of the skip panel from those bounds + virtual void FillRectSkippingPanel( const Color &clr, int x, int y, int w, int h, Panel *skipPanel ); + + virtual int GetPaintBackgroundType(); + virtual void GetCornerTextureSize( int& w, int& h ); + + bool IsChildOfModalSubTree(); + bool IsChildOfSurfaceModalPanel(); + + bool ShouldHandleInputMessage(); + + virtual void SetSkipChildDuringPainting( Panel *child ); + + // If this is set, then the drag drop won't occur until the mouse leaves the drag panels current rectangle + void SetStartDragWhenMouseExitsPanel( bool state ); + bool IsStartDragWhenMouseExitsPanel() const; + + void DisableMouseInputForThisPanel( bool bDisable ); + bool IsMouseInputDisabledForThisPanel() const; + + bool GetForceStereoRenderToFrameBuffer() const { return m_bForceStereoRenderToFrameBuffer; } + void SetForceStereoRenderToFrameBuffer( bool bForce ) { m_bForceStereoRenderToFrameBuffer = bForce; } + + void PostMessageToAllSiblings( KeyValues *msg, float delaySeconds = 0.0f ); + template< class S > + void PostMessageToAllSiblingsOfType( KeyValues *msg, float delaySeconds = 0.0f ); + + void SetConsoleStylePanel( bool bConsoleStyle ); + bool IsConsoleStylePanel() const; + + void SetParentNeedsCursorMoveEvents( bool bNeedsEvents ) { m_bParentNeedsCursorMoveEvents = bNeedsEvents; } + bool ParentNeedsCursorMoveEvents() const { return m_bParentNeedsCursorMoveEvents; } + + // For 360: support directional navigation between UI controls via dpad + enum NAV_DIRECTION { ND_UP, ND_DOWN, ND_LEFT, ND_RIGHT, ND_BACK, ND_NONE }; + virtual Panel* NavigateUp(); + virtual Panel* NavigateDown(); + virtual Panel* NavigateLeft(); + virtual Panel* NavigateRight(); + virtual Panel* NavigateActivate(); + virtual Panel* NavigateBack(); + virtual void NavigateTo(); + virtual void NavigateFrom(); + virtual void NavigateToChild( Panel *pNavigateTo ); //mouse support + // if set, Panel gets PerformLayout called after the camera and the renderer's m_matrixWorldToScreen has been setup, so panels can be correctly attached to entities in the world + inline void SetWorldPositionCurrentFrame( bool bWorldPositionCurrentFrame ) { m_bWorldPositionCurrentFrame = bWorldPositionCurrentFrame; } + inline bool GetWorldPositionCurrentFrame() { return m_bWorldPositionCurrentFrame; } + + Panel* SetNavUp( Panel* navUp ); + Panel* SetNavDown( Panel* navDown ); + Panel* SetNavLeft( Panel* navLeft ); + Panel* SetNavRight( Panel* navRight ); + Panel* SetNavToRelay( Panel* navToRelay ); + Panel* SetNavActivate( Panel* navActivate ); + Panel* SetNavBack( Panel* navBack ); + NAV_DIRECTION GetLastNavDirection(); + MESSAGE_FUNC_CHARPTR( OnNavigateTo, "OnNavigateTo", panelName ); + MESSAGE_FUNC_CHARPTR( OnNavigateFrom, "OnNavigateFrom", panelName ); + +// Drag Drop protected/internal interface +protected: + + virtual void OnStartDragging(); + virtual void OnContinueDragging(); + virtual void OnFinishDragging( bool mousereleased, MouseCode code, bool aborted = false ); + + virtual void DragDropStartDragging(); + + virtual void GetDragData( CUtlVector< KeyValues * >& list ); + virtual void CreateDragData(); + + virtual void PaintTraverse(bool Repaint, bool allowForce = true); + +protected: + virtual void OnChildSettingsApplied( KeyValues *pInResourceData, Panel *pChild ); + + MESSAGE_FUNC_ENUM_ENUM( OnRequestFocus, "OnRequestFocus", VPANEL, subFocus, VPANEL, defaultPanel); + MESSAGE_FUNC_INT_INT( OnScreenSizeChanged, "OnScreenSizeChanged", oldwide, oldtall ); + virtual void *QueryInterface(EInterfaceID id); + + void AddToOverridableColors( Color *pColor, char const *scriptname ) + { + int iIdx = m_OverridableColorEntries.AddToTail(); + m_OverridableColorEntries[iIdx].m_pszScriptName = scriptname; + m_OverridableColorEntries[iIdx].m_pColor = pColor; + m_OverridableColorEntries[iIdx].m_bOverridden = false; + } + + void ApplyOverridableColors( void ); + void SetOverridableColor( Color *pColor, const Color &newColor ); + +public: + void SetNavUp( const char* controlName ); + void SetNavDown( const char* controlName ); + void SetNavLeft( const char* controlName ); + void SetNavRight( const char* controlName ); + void SetNavToRelay( const char* controlName ); + void SetNavActivate( const char* controlName ); + void SetNavBack( const char* controlName ); + + /* + Will recursively look for the next visible panel in the navigation chain, parameters are for internal use. + It will stop looking if first == nextpanel (to prevent infinite looping). + */ + Panel* GetNavUp( Panel *first = NULL ); + Panel* GetNavDown( Panel *first = NULL ); + Panel* GetNavLeft( Panel *first = NULL ); + Panel* GetNavRight( Panel *first = NULL ); + Panel* GetNavToRelay( Panel *first = NULL ); + Panel* GetNavActivate( Panel *first = NULL ); + Panel* GetNavBack( Panel *first = NULL ); + + const char* GetNavUpName( void ) const { return m_sNavUpName.String(); } + const char* GetNavDownName( void ) const { return m_sNavDownName.String(); } + const char* GetNavLeftName( void ) const { return m_sNavLeftName.String(); } + const char* GetNavRightName( void ) const { return m_sNavRightName.String(); } + const char* GetNavToRelayName( void ) const { return m_sNavToRelayName.String(); } + const char* GetNavActivateName( void ) const { return m_sNavActivateName.String(); } + const char* GetNavBackName( void ) const { return m_sNavBackName.String(); } + + enum BuildModeFlags_t + { + BUILDMODE_EDITABLE = 1 << 0, + BUILDMODE_DELETABLE = 1 << 1, + BUILDMODE_SAVE_XPOS_RIGHTALIGNED = 1 << 2, + BUILDMODE_SAVE_XPOS_CENTERALIGNED = 1 << 3, + BUILDMODE_SAVE_YPOS_BOTTOMALIGNED = 1 << 4, + BUILDMODE_SAVE_YPOS_CENTERALIGNED = 1 << 5, + BUILDMODE_SAVE_WIDE_FULL = 1 << 6, + BUILDMODE_SAVE_TALL_FULL = 1 << 7, + BUILDMODE_SAVE_PROPORTIONAL_TO_PARENT = 1 << 8, + BUILDMODE_SAVE_WIDE_PROPORTIONAL = 1 << 9, + BUILDMODE_SAVE_TALL_PROPORTIONAL = 1 << 10, + BUILDMODE_SAVE_XPOS_PROPORTIONAL_SELF = 1 << 11, + BUILDMODE_SAVE_YPOS_PROPORTIONAL_SELF = 1 << 12, + BUILDMODE_SAVE_WIDE_PROPORTIONAL_TALL = 1 << 13, + BUILDMODE_SAVE_TALL_PROPORTIONAL_WIDE = 1 << 14, + BUILDMODE_SAVE_XPOS_PROPORTIONAL_PARENT = 1 << 15, + BUILDMODE_SAVE_YPOS_PROPORTIONAL_PARENT = 1 << 16, + BUILDMODE_SAVE_WIDE_PROPORTIONAL_SELF = 1 << 17, + BUILDMODE_SAVE_TALL_PROPORTIONAL_SELF = 1 << 18, + }; + +protected: + //this will return m_NavDown and will not look for the next visible panel + Panel* GetNavUpPanel(); + Panel* GetNavDownPanel(); + Panel* GetNavLeftPanel(); + Panel* GetNavRightPanel(); + Panel* GetNavToRelayPanel(); + Panel* GetNavActivatePanel(); + Panel* GetNavBackPanel(); + + bool m_PassUnhandledInput; + NAV_DIRECTION m_LastNavDirection; + +private: + + enum PanelFlags_t + { + MARKED_FOR_DELETION = 0x0001, + NEEDS_REPAINT = 0x0002, + PAINT_BORDER_ENABLED = 0x0004, + PAINT_BACKGROUND_ENABLED = 0x0008, + PAINT_ENABLED = 0x0010, + POST_CHILD_PAINT_ENABLED = 0x0020, + AUTODELETE_ENABLED = 0x0040, + NEEDS_LAYOUT = 0x0080, + NEEDS_SCHEME_UPDATE = 0x0100, + NEEDS_DEFAULT_SETTINGS_APPLIED = 0x0200, +#if defined( VGUI_USEKEYBINDINGMAPS ) + ALLOW_CHAIN_KEYBINDING_TO_PARENT = 0x0400, +#endif + IN_PERFORM_LAYOUT = 0x0800, + IS_PROPORTIONAL = 0x1000, + TRIPLE_PRESS_ALLOWED = 0x2000, + DRAG_REQUIRES_PANEL_EXIT = 0x4000, + IS_MOUSE_DISABLED_FOR_THIS_PANEL_ONLY = 0x8000, + ALL_FLAGS = 0xFFFF, + }; + + // used to get the Panel * for users with only IClientPanel + virtual Panel *GetPanel() { return this; } + + // private methods + void Think(); + void PerformApplySchemeSettings(); + + void InternalPerformLayout(); + void InternalSetCursor(); + + MESSAGE_FUNC_INT_INT( InternalCursorMoved, "CursorMoved", xpos, ypos ); + MESSAGE_FUNC( InternalCursorEntered, "CursorEntered" ); + MESSAGE_FUNC( InternalCursorExited, "CursorExited" ); + + MESSAGE_FUNC_INT( InternalMousePressed, "MousePressed", code ); + MESSAGE_FUNC_INT( InternalMouseDoublePressed, "MouseDoublePressed", code ); + // Triple presses are synthesized + MESSAGE_FUNC_INT( InternalMouseTriplePressed, "MouseTriplePressed", code ); + MESSAGE_FUNC_INT( InternalMouseReleased, "MouseReleased", code ); + MESSAGE_FUNC_INT( InternalMouseWheeled, "MouseWheeled", delta ); + MESSAGE_FUNC_INT( InternalKeyCodePressed, "KeyCodePressed", code ); + MESSAGE_FUNC_INT( InternalKeyCodeTyped, "KeyCodeTyped", code ); + MESSAGE_FUNC_INT( InternalKeyTyped, "KeyTyped", unichar ); + MESSAGE_FUNC_INT( InternalKeyCodeReleased, "KeyCodeReleased", code ); + + MESSAGE_FUNC( InternalKeyFocusTicked, "KeyFocusTicked" ); + MESSAGE_FUNC( InternalMouseFocusTicked, "MouseFocusTicked" ); + + MESSAGE_FUNC( InternalInvalidateLayout, "Invalidate" ); + + MESSAGE_FUNC( InternalMove, "Move" ); + virtual void InternalFocusChanged(bool lost); // called when the focus gets changed + + void PreparePanelMap( PanelMap_t *panelMap ); + + bool InternalRequestInfo( PanelAnimationMap *map, KeyValues *outputData ); + bool InternalSetInfo( PanelAnimationMap *map, KeyValues *inputData ); + + PanelAnimationMapEntry *FindPanelAnimationEntry( char const *scriptname, PanelAnimationMap *map ); + + // Recursively invoke settings for PanelAnimationVars + void InternalApplySettings( PanelAnimationMap *map, KeyValues *inResourceData); + void InternalInitDefaultValues( PanelAnimationMap *map ); + + // Purpose: Loads panel details related to autoresize from the resource info + void ApplyAutoResizeSettings(KeyValues *inResourceData); + + void FindDropTargetPanel_R( CUtlVector< VPANEL >& panelList, int x, int y, VPANEL check ); + Panel *FindDropTargetPanel(); + + int GetProportionalScaledValue( int rootTall, int normalizedValue ); + +#if defined( VGUI_USEDRAGDROP ) + DragDrop_t *m_pDragDrop; + Color m_clrDragFrame; + Color m_clrDropFrame; +#endif + + BaseTooltip *m_pTooltips; + bool m_bToolTipOverridden; + + PHandle m_SkipChild; + long m_lLastDoublePressTime; + HFont m_infoFont; + +#if defined( VGUI_USEKEYBINDINGMAPS ) + KeyBindingContextHandle_t m_hKeyBindingsContext; +#endif + + // data + VPANEL _vpanel; // handle to a vgui panel + char *_panelName; // string name of the panel - only unique within the current context + IBorder *_border; + + CUtlFlags< unsigned short > _flags; // see PanelFlags_t + Dar<HPanel> _actionSignalTargetDar; // the panel to direct notify messages to ("Command", "TextChanged", etc.) + + CUtlVector<OverridableColorEntry> m_OverridableColorEntries; + + Color _fgColor; // foreground color + Color _bgColor; // background color + + HBuildGroup _buildGroup; + + short m_nPinDeltaX; // Relative position of the pinned corner to the edge + short m_nPinDeltaY; + short m_nResizeDeltaX; // Relative position of the non-pinned corner to the edge + short m_nResizeDeltaY; + + HCursor _cursor; + unsigned int _buildModeFlags; // flags that control how the build mode dialog handles this panel + + byte _pinCorner : 4; // the corner of the dialog this panel is pinned to + byte _autoResizeDirection : 4; // the directions in which the panel will auto-resize to + + unsigned char _tabPosition; // the panel's place in the tab ordering + HScheme m_iScheme; // handle to the scheme to use + + bool m_bIsDMXSerialized : 1; // Is this a DMX panel? + bool m_bUseSchemeColors : 1; // Should we use colors from the scheme? + bool m_bIsSilent : 1; // should this panel PostActionSignals? + bool m_bIsConsoleStylePanel : 1; + bool m_bParentNeedsCursorMoveEvents : 1; + + // Sibling pinning + char *_pinToSibling; // string name of the sibling panel we're pinned to + byte _pinToSiblingCorner; // the corner of the sibling panel we're pinned to + byte _pinCornerToSibling; // the corner of our panel that we're pinning to our sibling + PHandle m_pinSibling; + + CUtlString m_sNavUpName; + PHandle m_NavUp; + + CUtlString m_sNavDownName; + PHandle m_NavDown; + + CUtlString m_sNavLeftName; + PHandle m_NavLeft; + + CUtlString m_sNavRightName; + PHandle m_NavRight; + + CUtlString m_sNavToRelayName; + PHandle m_NavToRelay; + + CUtlString m_sNavActivateName; + PHandle m_NavActivate; + + CUtlString m_sNavBackName; + PHandle m_NavBack; + +private: + + char *_tooltipText; // Tool tip text for panels that share tooltip panels with other panels + + PHandle m_hMouseEventHandler; + + bool m_bWorldPositionCurrentFrame; // if set, Panel gets PerformLayout called after the camera and the renderer's m_matrixWorldToScreen has been setup, so panels can be correctly attached to entities in the world + + bool m_bForceStereoRenderToFrameBuffer; + + static Panel* m_sMousePressedPanels[ ( MOUSE_MIDDLE - MOUSE_LEFT ) + 1 ]; + + CUtlDict< VPanelHandle > m_dictChidlren; + + CPanelAnimationVar( float, m_flAlpha, "alpha", "255" ); + + // 1 == Textured (TextureId1 only) + // 2 == Rounded Corner Box + CPanelAnimationVar( int, m_nPaintBackgroundType, "PaintBackgroundType", "0" ); + CPanelAnimationVarAliasType( int, m_nBgTextureId1, "Texture1", "vgui/hud/800corner1", "textureid" ); + CPanelAnimationVarAliasType( int, m_nBgTextureId2, "Texture2", "vgui/hud/800corner2", "textureid" ); + CPanelAnimationVarAliasType( int, m_nBgTextureId3, "Texture3", "vgui/hud/800corner3", "textureid" ); + CPanelAnimationVarAliasType( int, m_nBgTextureId4, "Texture4", "vgui/hud/800corner4", "textureid" ); + + //============================================================================= + // HPE_BEGIN: + // [tj] A bitset of flags to determine which corners should be rounded + //============================================================================= + unsigned char m_roundedCorners; + //============================================================================= + // HPE_END + //============================================================================= + friend class BuildGroup; + friend class BuildModeDialog; + friend class PHandle; + + // obselete, remove soon + void OnOldMessage(KeyValues *params, VPANEL ifromPanel); +}; + +inline void Panel::DisableMouseInputForThisPanel( bool bDisable ) +{ + _flags.SetFlag( IS_MOUSE_DISABLED_FOR_THIS_PANEL_ONLY, bDisable ); +} + +inline bool Panel::IsMouseInputDisabledForThisPanel() const +{ + return _flags.IsFlagSet( IS_MOUSE_DISABLED_FOR_THIS_PANEL_ONLY ); +} + +#if 0 +// This function cannot be defined here because it requires on a full definition of +// KeyValues (to call KeyValues::MakeCopy()) whereas the rest of this header file +// assumes a forward declared definition of KeyValues. +template< class S > +inline void Panel::PostMessageToAllSiblingsOfType( KeyValues *msg, float delaySeconds /*= 0.0f*/ ) +{ + Panel *parent = GetParent(); + if ( parent ) + { + int nChildCount = parent->GetChildCount(); + for ( int i = 0; i < nChildCount; ++i ) + { + Panel *sibling = parent->GetChild( i ); + if ( sibling == this ) + continue; + if ( dynamic_cast< S * >( sibling ) ) + { + PostMessage( sibling->GetVPanel(), msg->MakeCopy(), delaySeconds ); + } + } + } + + msg->deleteThis(); +} +#endif + +class Button; + +struct SortedPanel_t +{ + SortedPanel_t( Panel *panel ); + + Panel *pPanel; + Button *pButton; +}; + +class CSortedPanelYLess +{ +public: + bool Less( const SortedPanel_t &src1, const SortedPanel_t &src2, void *pCtx ) + { + int nX1, nY1, nX2, nY2; + src1.pPanel->GetPos( nX1, nY1 ); + src2.pPanel->GetPos( nX2, nY2 ); + + if ( nY1 == nY2 ) + { + return ( nX1 < nX2 ); + } + + if ( nY1 < nY2 ) + { + return true; + } + + return false; + } +}; + + +void VguiPanelGetSortedChildPanelList( Panel *pParentPanel, void *pSortedPanels ); +void VguiPanelGetSortedChildButtonList( Panel *pParentPanel, void *pSortedPanels, char *pchFilter = NULL, int nFilterType = 0 ); +int VguiPanelNavigateSortedChildButtonList( void *pSortedPanels, int nDir ); +int ComputeWide(Panel* pPanel, unsigned int& nBuildFlags, KeyValues *inResourceData, int nParentWide, int nParentTall, bool bComputingForTall); +int ComputeTall(Panel* pPanel, unsigned int& nBuildFlags, KeyValues *inResourceData, int nParentWide, int nParentTall, bool bComputingForWide); + +enum EOperator +{ + OP_ADD, + OP_SUB, + OP_SET, +}; +int ComputePos( Panel* pPanel, const char *pszInput, int &nPos, const int& nSize, const int& nParentSize, const bool& bX, EOperator eOp ); + + +} // namespace vgui + + +#endif // PANEL_H diff --git a/public/vgui_controls/PanelAnimationVar.h b/public/vgui_controls/PanelAnimationVar.h new file mode 100644 index 0000000..24c41c8 --- /dev/null +++ b/public/vgui_controls/PanelAnimationVar.h @@ -0,0 +1,161 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//=============================================================================// + +#ifndef PANELANIMATIONVAR_H +#define PANELANIMATIONVAR_H +#ifdef _WIN32 +#pragma once +#endif + +#include "tier1/utlvector.h" +#include <vgui_controls/Panel.h> + +#define DECLARE_PANELANIMATION( className ) \ + static void AddToAnimationMap( char const *scriptname, char const *type, char const *var, \ + char const *defaultvalue, bool array, PANELLOOKUPFUNC func ) \ + { \ + PanelAnimationMap *map = FindOrAddPanelAnimationMap( GetPanelClassName() ); \ + \ + PanelAnimationMapEntry entry; \ + entry.m_pszScriptName = scriptname; \ + entry.m_pszVariable = var; \ + entry.m_pszType = type; \ + entry.m_pszDefaultValue = defaultvalue; \ + entry.m_pfnLookup = func; \ + entry.m_bArray = array; \ + \ + map->entries.AddToTail( entry ); \ + } \ + \ + static void ChainToAnimationMap( void ) \ + { \ + static bool chained = false; \ + if ( chained ) \ + return; \ + chained = true; \ + PanelAnimationMap *map = FindOrAddPanelAnimationMap( GetPanelClassName() ); \ + map->pfnClassName = GetPanelClassName; \ + if ( map && GetPanelBaseClassName() && GetPanelBaseClassName()[0] ) \ + { \ + map->baseMap = FindOrAddPanelAnimationMap( GetPanelBaseClassName() ); \ + } \ + } \ + \ + class className##_Register; \ + friend class className##_Register; \ + class className##_Register \ + { \ + public: \ + className##_Register() \ + { \ + className::ChainToAnimationMap(); \ + } \ + }; \ + className##_Register m_RegisterAnimationClass; \ + \ + virtual PanelAnimationMap *GetAnimMap() \ + { \ + return FindOrAddPanelAnimationMap( GetPanelClassName() ); \ + } + +typedef void *( *PANELLOOKUPFUNC )( vgui::Panel *panel ); + +// Use this macro to define a variable which hudanimations.txt and hudlayout.res scripts can access +#define CPanelAnimationVarAliasType( type, name, scriptname, defaultvalue, typealias ) \ + class PanelAnimationVar_##name; \ + friend class PanelAnimationVar_##name; \ + static void *GetVar_##name( vgui::Panel *panel ) \ + { \ + return &(( ThisClass *)panel)->name; \ + } \ + class PanelAnimationVar_##name \ + { \ + public: \ + static void InitVar() \ + { \ + static bool bAdded = false; \ + if ( !bAdded ) \ + { \ + bAdded = true; \ + AddToAnimationMap( scriptname, typealias, #name, defaultvalue, false, ThisClass::GetVar_##name ); \ + } \ + } \ + PanelAnimationVar_##name() \ + { \ + PanelAnimationVar_##name::InitVar(); \ + } \ + }; \ + PanelAnimationVar_##name m_##name##_register; \ + type name; + +#define CPanelAnimationVar( type, name, scriptname, defaultvalue ) \ + CPanelAnimationVarAliasType( type, name, scriptname, defaultvalue, #type ) + +// Use this macro to define a variable which hudanimations.txt and hudlayout.res scripts can access +#define CPanelAnimationStringVarAliasType( count, name, scriptname, defaultvalue, typealias ) \ + class PanelAnimationVar_##name; \ + friend class PanelAnimationVar_##name; \ + static void *GetVar_##name( vgui::Panel *panel ) \ + { \ + return &(( ThisClass *)panel)->name; \ + } \ + class PanelAnimationVar_##name \ + { \ + public: \ + static void InitVar() \ + { \ + static bool bAdded = false; \ + if ( !bAdded ) \ + { \ + bAdded = true; \ + AddToAnimationMap( scriptname, typealias, #name, defaultvalue, true, ThisClass::GetVar_##name ); \ + } \ + } \ + PanelAnimationVar_##name() \ + { \ + PanelAnimationVar_##name::InitVar(); \ + } \ + }; \ + PanelAnimationVar_##name m_##name##_register; \ + char name[ count ]; + +#define CPanelAnimationStringVar( count, name, scriptname, defaultvalue ) \ + CPanelAnimationStringVarAliasType( count, name, scriptname, defaultvalue, "string" ) + +struct PanelAnimationMapEntry +{ + char const *name() { return m_pszScriptName; } + char const *type() { return m_pszType; } + char const *defaultvalue() { return m_pszDefaultValue; } + bool isarray() { return m_bArray; } + + char const *m_pszScriptName; + char const *m_pszVariable; + char const *m_pszType; + char const *m_pszDefaultValue; + bool m_bArray; + + PANELLOOKUPFUNC m_pfnLookup; +}; + +struct PanelAnimationMap +{ + PanelAnimationMap() + { + baseMap = NULL; + pfnClassName = NULL; + } + + CUtlVector< PanelAnimationMapEntry > entries; + PanelAnimationMap *baseMap; + char const *(*pfnClassName)( void ); +}; + +PanelAnimationMap *FindPanelAnimationMap( char const *className ); +PanelAnimationMap *FindOrAddPanelAnimationMap( char const *className ); +void PanelAnimationDumpVars( char const *className ); + +#endif // PANELANIMATIONVAR_H diff --git a/public/vgui_controls/PanelListPanel.h b/public/vgui_controls/PanelListPanel.h new file mode 100644 index 0000000..c4a647e --- /dev/null +++ b/public/vgui_controls/PanelListPanel.h @@ -0,0 +1,126 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef PANELLISTPANEL_H +#define PANELLISTPANEL_H + +#ifdef _WIN32 +#pragma once +#endif + +#include <utllinkedlist.h> +#include <utlvector.h> +#include <vgui/VGUI.h> +#include <vgui_controls/EditablePanel.h> + +class KeyValues; + +namespace vgui +{ + +//----------------------------------------------------------------------------- +// Purpose: A list of variable height child panels +// each list item consists of a label-panel pair. Height of the item is +// determined from the label. +//----------------------------------------------------------------------------- +class PanelListPanel : public EditablePanel +{ + DECLARE_CLASS_SIMPLE( PanelListPanel, Panel ); + +public: + PanelListPanel( vgui::Panel *parent, char const *panelName ); + ~PanelListPanel(); + + // DATA & ROW HANDLING + // The list now owns the panel + virtual int AddItem( Panel *labelPanel, Panel *panel ); + int GetItemCount() const; + int GetItemIDFromRow( int nRow ) const; + + // Iteration. Use these until they return InvalidItemID to iterate all the items. + int FirstItem() const; + int NextItem( int nItemID ) const; + int InvalidItemID() const; + + virtual Panel *GetItemLabel(int itemID); + virtual Panel *GetItemPanel(int itemID); + + ScrollBar* GetScrollbar() { return m_vbar; } + + virtual void RemoveItem(int itemID); // removes an item from the table (changing the indices of all following items) + virtual void DeleteAllItems(); // clears and deletes all the memory used by the data items + void RemoveAll(); + + // painting + virtual vgui::Panel *GetCellRenderer( int row ); + + // layout + void SetFirstColumnWidth( int width ); + int GetFirstColumnWidth(); + void SetNumColumns( int iNumColumns ); + int GetNumColumns( void ); + void MoveScrollBarToTop(); + + // selection + void SetSelectedPanel( Panel *panel ); + Panel *GetSelectedPanel(); + /* + On a panel being selected, a message gets sent to it + "PanelSelected" int "state" + where state is 1 on selection, 0 on deselection + */ + + void SetVerticalBufferPixels( int buffer ); + + void ScrollToItem( int itemNumber ); + + CUtlVector< int > *GetSortedVector( void ) + { + return &m_SortedItems; + } + + int ComputeVPixelsNeeded(); + +protected: + // overrides + virtual void OnSizeChanged(int wide, int tall); + MESSAGE_FUNC_INT( OnSliderMoved, "ScrollBarSliderMoved", position ); + virtual void PerformLayout(); + virtual void ApplySchemeSettings(vgui::IScheme *pScheme); + virtual void OnMouseWheeled(int delta); + +private: + + + enum { DEFAULT_HEIGHT = 24, PANELBUFFER = 5 }; + + typedef struct dataitem_s + { + // Always store a panel pointer + Panel *panel; + Panel *labelPanel; + } DATAITEM; + + // list of the column headers + + CUtlLinkedList<DATAITEM, int> m_DataItems; + CUtlVector<int> m_SortedItems; + + ScrollBar *m_vbar; + Panel *m_pPanelEmbedded; + + PHandle m_hSelectedItem; + int m_iFirstColumnWidth; + int m_iNumColumns; + int m_iDefaultHeight; + int m_iPanelBuffer; + + CPanelAnimationVar( bool, m_bAutoHideScrollbar, "autohide_scrollbar", "0" ); +}; + +} +#endif // PANELLISTPANEL_H diff --git a/public/vgui_controls/PerforceFileExplorer.h b/public/vgui_controls/PerforceFileExplorer.h new file mode 100644 index 0000000..4d3dd87 --- /dev/null +++ b/public/vgui_controls/PerforceFileExplorer.h @@ -0,0 +1,67 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: Allows you to browse a directory structure, showing perforce files +// +// $NoKeywords: $ +//===========================================================================// + +#ifndef PERFORCEFILEEXPLORER_H +#define PERFORCEFILEEXPLORER_H + +#ifdef _WIN32 +#pragma once +#endif + + +#include "tier1/utlstring.h" +#include "vgui_controls/Frame.h" + + +namespace vgui +{ + +//----------------------------------------------------------------------------- +// Forward declarations +//----------------------------------------------------------------------------- +class PerforceFileList; +class ComboBox; +class Button; + + +//----------------------------------------------------------------------------- +// Contains a list of files, determines their perforce status +//----------------------------------------------------------------------------- +class PerforceFileExplorer : public vgui::Frame +{ + DECLARE_CLASS_SIMPLE( PerforceFileExplorer, Frame ); + +public: + // The context keyvalues are added to all messages sent by this dialog if they are specified + PerforceFileExplorer( Panel *parent, const char *pPanelName ); + ~PerforceFileExplorer(); + + // Inherited from Frame + virtual void ApplySchemeSettings( IScheme *pScheme ); + virtual void PerformLayout(); + +protected: + MESSAGE_FUNC_PARAMS( OnTextChanged, "TextChanged", kv ); + MESSAGE_FUNC( OnItemDoubleClicked, "ItemDoubleClicked" ); + MESSAGE_FUNC( OnFolderUp, "FolderUp" ); + + void PopulateFileList(); + void PopulateDriveList(); + + // Returns the current directory + void SetCurrentDirectory( const char *pCurrentDirectory ); + + Button *m_pFolderUpButton; + ComboBox *m_pFullPathCombo; + PerforceFileList *m_pFileList; + CUtlString m_CurrentDirectory; +}; + + +} // namespace vgui + +#endif // PERFORCEFILEEXPLORER_H diff --git a/public/vgui_controls/PerforceFileList.h b/public/vgui_controls/PerforceFileList.h new file mode 100644 index 0000000..148b005 --- /dev/null +++ b/public/vgui_controls/PerforceFileList.h @@ -0,0 +1,114 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: Contains a list of files, determines their perforce status +// +// $NoKeywords: $ +//===========================================================================// + +#ifndef PERFORCEFILELIST_H +#define PERFORCEFILELIST_H + +#ifdef _WIN32 +#pragma once +#endif + +#include "tier1/utlstring.h" +#include "tier1/UtlStringMap.h" +#include "vgui_controls/ListPanel.h" + + +//----------------------------------------------------------------------------- +// Forward declarations +//----------------------------------------------------------------------------- +struct P4File_t; + +namespace vgui +{ + class ListPanel; +} + + +namespace vgui +{ + +//----------------------------------------------------------------------------- +// Contains a list of files, determines their perforce status +//----------------------------------------------------------------------------- +class PerforceFileList : public vgui::ListPanel +{ + DECLARE_CLASS_SIMPLE( PerforceFileList, ListPanel ); + +public: + // The context keyvalues are added to all messages sent by this dialog if they are specified + PerforceFileList( Panel *parent, const char *pPanelName ); + ~PerforceFileList(); + + // Add a file to the file list. Note that this file may exist on disk or not + // and it may exist in perforce or not. It's specified as a full path on disk though. + // In the case where a file doesn't exist on disk, but it does exist in perforce + // specify where that file would appear on disk. + // This function returns the itemID of the added file + // If you already know the file exists or is a directory (or not), specify that in the call. + // -1 means autodetect whether the file exists or is a directory + int AddFile( const char *pFullPath, int nFileExists = -1, int nIsDirectory = -1 ); + + // Is a file already in the list? + bool IsFileInList( const char *pFullPath ); + + // Find the item ID associated with a particular file + int FindFile( const char *pFullPath ); + + // Remove all files from the list + void RemoveAllFiles(); + + // Refresh perforce information + void Refresh(); + + // Refresh perforce information manually + void RefreshPerforceState( int nItemID, bool bFileExists, P4File_t *pFileInfo ); + + // Is a particular list item a directory? + bool IsDirectoryItem( int nItemID ); + + // Returns the file associated with a particular item ID + const char *GetFile( int nItemID ); + + // Toggle showing deleted files or not + void ShowDeletedFiles( bool bShowDeletedFiles ); + + // Inherited from vgui::EditablePanel + virtual void ApplySchemeSettings( IScheme *pScheme ); + virtual void OnMouseDoublePressed( MouseCode code ); + + /* + messages sent: + "ItemDoubleClicked" // Called when an item is double-clicked + */ + +protected: + struct DirectoryInfo_t + { + CUtlString m_ClientSpec; + CUtlVector< int > m_ItemIDs; + }; + + // Add a file to the file list. + int AddFileToFileList( const char *pFullPath, bool bExistsOnDisk ); + + // Add a directory to the file list. + int AddDirectoryToFileList( const char *pFullPath, bool bExistsOnDisk ); + + // Add a directory to the directory list, returns client spec + void AddItemToDirectoryList( const char *pFullPath, int nItemID, bool bIsDirectory ); + + // Used to look up directories -> client specs + CUtlStringMap< DirectoryInfo_t > m_Directories; + + // Show deleted files? + bool m_bShowDeletedFiles; +}; + + +} // namespace vgui + +#endif // PERFORCEFILELIST_H diff --git a/public/vgui_controls/ProgressBar.h b/public/vgui_controls/ProgressBar.h new file mode 100644 index 0000000..3dfac7f --- /dev/null +++ b/public/vgui_controls/ProgressBar.h @@ -0,0 +1,112 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef PROGRESSBAR_H +#define PROGRESSBAR_H + +#ifdef _WIN32 +#pragma once +#endif + +#include <vgui/VGUI.h> +#include <vgui_controls/Panel.h> + +namespace vgui +{ + +//----------------------------------------------------------------------------- +// Purpose: Status bar that visually displays discrete progress in the form +// of a segmented strip +//----------------------------------------------------------------------------- +class ProgressBar : public Panel +{ + DECLARE_CLASS_SIMPLE( ProgressBar, Panel ); + +public: + ProgressBar(Panel *parent, const char *panelName); + ~ProgressBar(); + + // 'progress' is in the range [0.0f, 1.0f] + MESSAGE_FUNC_FLOAT( SetProgress, "SetProgress", progress ); + float GetProgress(); + virtual void SetSegmentInfo( int gap, int width ); + + // utility function for calculating a time remaining string + static bool ConstructTimeRemainingString(OUT_Z_BYTECAP(outputBufferSizeInBytes) wchar_t *output, int outputBufferSizeInBytes, float startTime, float currentTime, float currentProgress, float lastProgressUpdateTime, bool addRemainingSuffix); + + void SetBarInset( int pixels ); + int GetBarInset( void ); + void SetMargin( int pixels ); + int GetMargin(); + + virtual void ApplySettings(KeyValues *inResourceData); + virtual void GetSettings(KeyValues *outResourceData); + virtual const char *GetDescription(); + + // returns the number of segment blocks drawn + int GetDrawnSegmentCount(); + + enum ProgressDir_e + { + PROGRESS_EAST, + PROGRESS_WEST, + PROGRESS_NORTH, + PROGRESS_SOUTH + }; + + int GetProgressDirection() const { return m_iProgressDirection; } + void SetProgressDirection( int val ) { m_iProgressDirection = val; } + +protected: + virtual void Paint(); + void PaintSegment( int &x, int &y, int tall, int wide ); + virtual void PaintBackground(); + virtual void ApplySchemeSettings(IScheme *pScheme); + MESSAGE_FUNC_PARAMS( OnDialogVariablesChanged, "DialogVariables", dialogVariables ); + /* CUSTOM MESSAGE HANDLING + "SetProgress" + input: "progress" - float value of the progress to set + */ + +protected: + int m_iProgressDirection; + float _progress; + +private: + int _segmentCount; + int _segmentGap; + int _segmentWide; + int m_iBarInset; + int m_iBarMargin; + char *m_pszDialogVar; +}; + +//----------------------------------------------------------------------------- +// Purpose: Non-segmented progress bar +//----------------------------------------------------------------------------- +class ContinuousProgressBar : public ProgressBar +{ + DECLARE_CLASS_SIMPLE( ContinuousProgressBar, ProgressBar ); + +public: + ContinuousProgressBar(Panel *parent, const char *panelName); + MESSAGE_FUNC_FLOAT( SetPrevProgress, "SetPrevProgress", prevProgress ); + + void SetGainColor( Color color ) { m_colorGain = color; } + void SetLossColor( Color color ) { m_colorLoss = color; } + + virtual void Paint(); + +protected: + float _prevProgress; + Color m_colorGain; + Color m_colorLoss; +}; + +} // namespace vgui + +#endif // PROGRESSBAR_H diff --git a/public/vgui_controls/ProgressBox.h b/public/vgui_controls/ProgressBox.h new file mode 100644 index 0000000..d5c321a --- /dev/null +++ b/public/vgui_controls/ProgressBox.h @@ -0,0 +1,99 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef PROGRESSBOX_H +#define PROGRESSBOX_H + +#ifdef _WIN32 +#pragma once +#endif + +#include <vgui/VGUI.h> +#include <vgui_controls/Frame.h> + +// prevent windows macros from messing with the class +#ifdef ProgressBox +#undef ProgressBox +#endif + +namespace vgui +{ + +//----------------------------------------------------------------------------- +// Purpose: Popup discardable message box +//----------------------------------------------------------------------------- +class ProgressBox : public Frame +{ + DECLARE_CLASS_SIMPLE( ProgressBox, Frame ); + +public: + // title - Text to be displayed in the title bar of the window + // text - Text message in the message box + // parent - parent panel of the message box, by default it has no parent. + ProgressBox(const char *title, const char *text, const char *pszUnknownTimeString, Panel *parent = NULL); + ProgressBox(const wchar_t *wszTitle, const wchar_t *wszText, const wchar_t *wszUnknownTimeString, Panel *parent = NULL); + ~ProgressBox(); + + // Put the message box into a modal state + virtual void DoModal(Frame *pFrameOver = NULL); + + // make the message box appear and in a modeless state + virtual void ShowWindow(Frame *pFrameOver = NULL); + + // updates progress bar, range [0, 1] + virtual void SetProgress(float progress); + + // sets the info text + virtual void SetText(const char *text); + + // toggles visibility of the close box. + virtual void SetCancelButtonVisible(bool state); + + // toggles the enabled state of the cancel button (for if it needs to be disabled part way through a process) + virtual void SetCancelButtonEnabled(bool state); + + /* custom messages: + + "ProgressBoxCancelled" + sent if the user pressed the cancel button (must be enabled & visible for this to happen) + + */ + +protected: + virtual void PerformLayout(); + virtual void OnClose(); + virtual void OnCloseFrameButtonPressed(); + virtual void ApplySchemeSettings(IScheme *pScheme); + virtual void OnThink(); + virtual void OnCommand(const char *command); + virtual void OnTick(); + + // called when the update has been cancelled + virtual void OnCancel(); + +private: + MESSAGE_FUNC( OnShutdownRequest, "ShutdownRequest" ); + void Init(); + void UpdateTitle(); + + Label *m_pMessageLabel; + ProgressBar *m_pProgressBar; + Button *m_pCancelButton; + + wchar_t m_wszTitleString[128]; + wchar_t m_wcsInfoString[128]; + wchar_t m_wszUnknownTimeString[128]; + + float m_flFirstProgressUpdate; + float m_flLastProgressUpdate; + float m_flCurrentProgress; +}; + +} // namespace vgui + + +#endif // PROGRESSBOX_H diff --git a/public/vgui_controls/PropertyDialog.h b/public/vgui_controls/PropertyDialog.h new file mode 100644 index 0000000..32747f0 --- /dev/null +++ b/public/vgui_controls/PropertyDialog.h @@ -0,0 +1,84 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef PROPERTYDIALOG_H +#define PROPERTYDIALOG_H + +#ifdef _WIN32 +#pragma once +#endif + +#include <vgui/VGUI.h> +#include <vgui_controls/Frame.h> + +namespace vgui +{ + +//----------------------------------------------------------------------------- +// Purpose: Simple frame that holds a property sheet +//----------------------------------------------------------------------------- +class PropertyDialog : public Frame +{ + DECLARE_CLASS_SIMPLE( PropertyDialog, Frame ); + +public: + PropertyDialog(Panel *parent, const char *panelName); + ~PropertyDialog(); + + // returns a pointer to the PropertySheet this dialog encapsulates + virtual PropertySheet *GetPropertySheet(); + + // wrapper for PropertySheet interface + virtual void AddPage(Panel *page, const char *title); + virtual Panel *GetActivePage(); + virtual void ResetAllData(); + virtual void ApplyChanges(); + + // sets the text on the OK/Cancel buttons, overriding the default + void SetOKButtonText(const char *text); + void SetCancelButtonText(const char *text); + void SetApplyButtonText(const char *text); + + // changes the visibility of the buttons + void SetOKButtonVisible(bool state); + void SetCancelButtonVisible(bool state); + void SetApplyButtonVisible(bool state); + + /* MESSAGES SENT + "ResetData" - sent when page is loaded. Data should be reloaded from document into controls. + "ApplyChanges" - sent when the OK / Apply button is pressed. Changed data should be written into document. + */ + +protected: + // Called when the OK button is pressed. Simply closes the dialog. + virtual bool OnOK(bool applyOnly); + + // called when the Cancel button is pressed + virtual void OnCancel(); + + // vgui overrides + virtual void PerformLayout(); + virtual void OnCommand(const char *command); + virtual void ActivateBuildMode(); + virtual void OnKeyCodeTyped(KeyCode code); + virtual void RequestFocus(int direction = 0); + + MESSAGE_FUNC( OnApplyButtonEnable, "ApplyButtonEnable" ); + void EnableApplyButton(bool bEnable); + +private: + PropertySheet *_propertySheet; + Button *_okButton; + Button *_cancelButton; + Button *_applyButton; + + CPanelAnimationVar( int, m_iSheetInsetBottom, "sheetinset_bottom", "32" ); +}; + +}; // vgui + +#endif // PROPERTYDIALOG_H diff --git a/public/vgui_controls/PropertyPage.h b/public/vgui_controls/PropertyPage.h new file mode 100644 index 0000000..8120ed0 --- /dev/null +++ b/public/vgui_controls/PropertyPage.h @@ -0,0 +1,58 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef PROPERTYPAGE_H +#define PROPERTYPAGE_H + +#ifdef _WIN32 +#pragma once +#endif + +#include <vgui_controls/EditablePanel.h> +#include <vgui_controls/PHandle.h> + +namespace vgui +{ + +//----------------------------------------------------------------------------- +// Purpose: Property page, as held by a set of property sheets +//----------------------------------------------------------------------------- +class PropertyPage : public EditablePanel +{ + DECLARE_CLASS_SIMPLE( PropertyPage, EditablePanel ); + +public: + PropertyPage(Panel *parent, const char *panelName); + ~PropertyPage(); + + // Called when page is loaded. Data should be reloaded from document into controls. + MESSAGE_FUNC( OnResetData, "ResetData" ); + + // Called when the OK / Apply button is pressed. Changed data should be written into document. + MESSAGE_FUNC( OnApplyChanges, "ApplyChanges" ); + + // called when the page is shown/hidden + MESSAGE_FUNC( OnPageShow, "PageShow" ); + MESSAGE_FUNC( OnPageHide, "PageHide" ); + + virtual void OnKeyCodeTyped(KeyCode code); + virtual bool HasUserConfigSettings() { return true; } + + virtual void SetVisible(bool state); + +protected: + // called to be notified of the tab button used to Activate this page + // if overridden this must be chained back to + MESSAGE_FUNC_PTR( OnPageTabActivated, "PageTabActivated", panel ); + +private: + PHandle _pageTab; +}; + +} // namespace vgui + +#endif // PROPERTYPAGE_H diff --git a/public/vgui_controls/PropertySheet.h b/public/vgui_controls/PropertySheet.h new file mode 100644 index 0000000..d6fdf88 --- /dev/null +++ b/public/vgui_controls/PropertySheet.h @@ -0,0 +1,209 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef PROPERTYSHEET_H +#define PROPERTYSHEET_H + +#ifdef _WIN32 +#pragma once +#endif + +#include "vgui/VGUI.h" +#include "vgui_controls/EditablePanel.h" +#include "vgui_controls/PHandle.h" +#include "utlvector.h" + +namespace vgui +{ + +class PageTab; +class ImagePanel; + +//----------------------------------------------------------------------------- +// Purpose: Tabbed property sheet. Holds and displays a set of Panel's +//----------------------------------------------------------------------------- +class PropertySheet : public EditablePanel +{ + DECLARE_CLASS_SIMPLE( PropertySheet, EditablePanel ); + +public: + PropertySheet(Panel *parent, const char *panelName, bool draggableTabs = false ); + PropertySheet(Panel *parent, const char *panelName,ComboBox *combo); + ~PropertySheet(); + + virtual bool IsDraggableTab() const; + void SetDraggableTabs( bool state ); + + // Adds a page to the sheet. The first page added becomes the active sheet. + virtual void AddPage(Panel *page, const char *title, char const *imageName = NULL, bool showContextMenu = false ); + + // sets the current page + virtual void SetActivePage(Panel *page); + + // sets the width, in pixels, of the page tab buttons. + virtual void SetTabWidth(int pixels); + + // Gets a pointer to the currently active page. + virtual Panel *GetActivePage(); + + // Removes (but doesn't delete) all pages + virtual void RemoveAllPages(); + + // Removes all the pages and marks all the pages for deletion. + virtual void DeleteAllPages(); + + // reloads the data in all the property page + virtual void ResetAllData(); + + // writes out any changed data to the doc + virtual void ApplyChanges(); + + // focus handling - passed on to current active page + virtual void RequestFocus(int direction = 0); + virtual bool RequestFocusPrev(VPANEL panel = NULL); + virtual bool RequestFocusNext(VPANEL panel = NULL); + + // returns the ith panel + virtual Panel *GetPage(int i); + + // deletes this panel from the sheet + virtual void DeletePage(Panel *panel); + // removes this panel from the sheet, sets its parent to NULL, but does not delete it + virtual void RemovePage(Panel *panel); + + // returns the current activated tab + virtual Panel *GetActiveTab(); + + // returns the title text of the tab + virtual void GetActiveTabTitle( char *textOut, int bufferLen ); + + // returns the title of tab "i" + virtual bool GetTabTitle( int i, char *textOut, int bufferLen ); + + // sets the title of tab "i" + virtual bool SetTabTitle( int i, char *pchTitle ); + + // returns the index of the active page + virtual int GetActivePageNum(); + + // returns the number of pages in the sheet + virtual int GetNumPages(); + + // disable the page with title "title" + virtual void DisablePage(const char *title); + + // enable the page with title "title" + virtual void EnablePage(const char *title); + + virtual void SetSmallTabs( bool state ); + virtual bool IsSmallTabs() const; + + /* MESSAGES SENT TO PAGES + "PageShow" - sent when a page is shown + "PageHide" - sent when a page is hidden + "ResetData" - sent when the data should be reloaded from doc + "ApplyChanges" - sent when data should be written to doc + */ + + virtual void OnPanelDropped( CUtlVector< KeyValues * >& msglist ); + virtual bool IsDroppable( CUtlVector< KeyValues * >& msglist ); + // Mouse is now over a droppable panel + virtual void OnDroppablePanelPaint( CUtlVector< KeyValues * >& msglist, CUtlVector< Panel * >& dragPanels ); + + void ShowContextButtons( bool state ); + bool ShouldShowContextButtons() const; + + int FindPage( Panel *page ) const; + + bool PageHasContextMenu( Panel *page ) const; + + void SetKBNavigationEnabled( bool state ); + bool IsKBNavigationEnabled() const; + + virtual bool HasUserConfigSettings() { return true; } + +protected: + virtual void PaintBorder(); + virtual void PerformLayout(); + virtual Panel *HasHotkey(wchar_t key); + virtual void ChangeActiveTab(int index); + virtual void OnKeyCodePressed(KeyCode code); + virtual void OnCommand(const char *command); + virtual void ApplySchemeSettings(IScheme *pScheme); + virtual void ApplySettings(KeyValues *inResourceData); + + // internal message handlers + MESSAGE_FUNC_PTR( OnTabPressed, "TabPressed", panel ); + MESSAGE_FUNC_PTR_WCHARPTR( OnTextChanged, "TextChanged", panel, text ); + MESSAGE_FUNC_PARAMS( OnOpenContextMenu, "OpenContextMenu", params ); + MESSAGE_FUNC( OnApplyButtonEnable, "ApplyButtonEnable" ); + // called when default button has been set + MESSAGE_FUNC_HANDLE( OnDefaultButtonSet, "DefaultButtonSet", button ); + // called when the current default button has been set + MESSAGE_FUNC_HANDLE( OnCurrentDefaultButtonSet, "CurrentDefaultButtonSet", button); + MESSAGE_FUNC( OnFindDefaultButton, "FindDefaultButton" ); + +private: + + // enable/disable the page with title "title" + virtual void SetPageEnabled(const char *title,bool state); + + struct Page_t + { + Page_t() : + page( 0 ), + contextMenu( false ) + { + } + + Panel *page; + bool contextMenu; + }; + + CUtlVector<Page_t> m_Pages; + CUtlVector<PageTab *> m_PageTabs; + Panel *_activePage; + PageTab *_activeTab; + int _tabWidth; + int _activeTabIndex; + ComboBox *_combo; + bool _showTabs; + bool _tabFocus; + + PHandle m_hPreviouslyActivePage; + float m_flPageTransitionEffectTime; + bool m_bSmallTabs; + HFont m_tabFont; + bool m_bDraggableTabs; + bool m_bContextButton; + bool m_bKBNavigationEnabled; + + CPanelAnimationVarAliasType( int, m_iTabXIndent, "tabxindent", "0", "proportional_int" ); + CPanelAnimationVarAliasType( int, m_iTabXDelta, "tabxdelta", "0", "proportional_int" ); + CPanelAnimationVarAliasType( bool, m_bTabFitText, "tabxfittotext", "1", "bool" ); + + //============================================================================= + // HPE_BEGIN: + // [tj] These variables have been split into the initially specified size + // and the currently set size. This is so we can always recalculate the + // new value for resolution changes. + //============================================================================= + CPanelAnimationVarAliasType( int, m_iSpecifiedTabHeight, "tabheight", "28", "int" ); + CPanelAnimationVarAliasType( int, m_iSpecifiedTabHeightSmall, "tabheight_small", "14", "int" ); + + int m_iTabHeight; + int m_iTabHeightSmall; + //============================================================================= + // HPE_END + //============================================================================= + + KeyValues *m_pTabKV; +}; + +}; // namespace vgui + +#endif // PROPERTYSHEET_H diff --git a/public/vgui_controls/QueryBox.h b/public/vgui_controls/QueryBox.h new file mode 100644 index 0000000..40e6e46 --- /dev/null +++ b/public/vgui_controls/QueryBox.h @@ -0,0 +1,62 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: Creates a Message box with a question in it and yes/no buttons +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef QUERYBOX_H +#define QUERYBOX_H + +#ifdef _WIN32 +#pragma once +#endif + +#include <KeyValues.h> +#include <vgui_controls/MessageBox.h> +#include <vgui_controls/Button.h> + +namespace vgui +{ + +//----------------------------------------------------------------------------- +// Purpose: Creates A Message box with a question in it and yes/no buttons +//----------------------------------------------------------------------------- +class QueryBox : public MessageBox +{ + DECLARE_CLASS_SIMPLE( QueryBox, MessageBox ); + +public: + QueryBox(const char *title, const char *queryText,vgui::Panel *parent = NULL ); + QueryBox(const wchar_t *wszTitle, const wchar_t *wszQueryText,vgui::Panel *parent = NULL); + ~QueryBox(); + + // Layout the window for drawing + virtual void PerformLayout(); + + // Set the keyvalues to send when ok button is hit + void SetOKCommand(KeyValues *keyValues); + + // Set the keyvalues to send when the cancel button is hit + void SetCancelCommand(KeyValues *keyValues); + + // Set the text on the Cancel button + void SetCancelButtonText(const char *buttonText); + void SetCancelButtonText(const wchar_t *wszButtonText); + + // Set a value of the ok command + void SetOKCommandValue(const char *keyName, int value); + +protected: + virtual void OnKeyCodeTyped( KeyCode code ); + virtual void OnKeyCodePressed( KeyCode code ); + virtual void OnCommand(const char *command); + Button *m_pCancelButton; + +private: + KeyValues *m_pCancelCommand; + KeyValues *m_pOkCommand; +}; + +} +#endif // QUERYBOX_H diff --git a/public/vgui_controls/RadioButton.h b/public/vgui_controls/RadioButton.h new file mode 100644 index 0000000..c21abba --- /dev/null +++ b/public/vgui_controls/RadioButton.h @@ -0,0 +1,112 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef RADIOBUTTON_H +#define RADIOBUTTON_H + +#ifdef _WIN32 +#pragma once +#endif + +#include <vgui/VGUI.h> +#include <vgui_controls/ToggleButton.h> +#include <vgui_controls/TextImage.h> + +namespace vgui +{ + +//----------------------------------------------------------------------------- +// Purpose: Radio buton image +//----------------------------------------------------------------------------- +class RadioImage : public TextImage +{ +public: + RadioImage(RadioButton *radioButton) : TextImage( "n" ) + { + _radioButton = radioButton; + + SetSize(20, 13); + } + + virtual void Paint(); + + virtual void SetColor(Color color) + { + _borderColor1 = color; + _borderColor2 = color; + _checkColor = color; + } + + Color _borderColor1; + Color _borderColor2; + Color _checkColor; + + Color _bgColor; + +private: + RadioButton *_radioButton; +}; + +//----------------------------------------------------------------------------- +// Purpose: Radio buttons are automatically selected into groups by who their +// parent is. At most one radio button is active at any time. +//----------------------------------------------------------------------------- +class RadioButton : public ToggleButton +{ + DECLARE_CLASS_SIMPLE( RadioButton, ToggleButton ); + +public: + RadioButton(Panel *parent, const char *panelName, const char *text); + ~RadioButton(); + + // Set the radio button checked. When a radio button is checked, a + // message is sent to all other radio buttons in the same group so + // they will become unchecked. + virtual void SetSelected(bool state); + + // Get the tab position of the radio button with the set of radio buttons + // A group of RadioButtons must have the same TabPosition, with [1, n] subtabpositions + virtual int GetSubTabPosition(); + virtual void SetSubTabPosition(int position); + + // Return the RadioButton's real tab position (its Panel one changes) + virtual int GetRadioTabPosition(); + + // Set the selection state of the radio button, but don't fire + // any action signals or messages to other radio buttons + virtual void SilentSetSelected(bool state); + +protected: + virtual void DoClick(); + + virtual void Paint(); + virtual void ApplySchemeSettings(IScheme *pScheme); + MESSAGE_FUNC_INT( OnRadioButtonChecked, "RadioButtonChecked", tabposition); + virtual void OnKeyCodeTyped(KeyCode code); + + virtual IBorder *GetBorder(bool depressed, bool armed, bool selected, bool keyfocus); + + virtual void ApplySettings(KeyValues *inResourceData); + virtual void GetSettings(KeyValues *outResourceData); + virtual const char *GetDescription(); + virtual void PerformLayout(); + + RadioButton *FindBestRadioButton(int direction); + +private: + RadioImage *_radioBoxImage; + int _oldTabPosition; + Color _selectedFgColor; + + int _subTabPosition; // tab position with the radio button list + + void InternalSetSelected(bool state, bool bFireEvents); +}; + +}; // namespace vgui + +#endif // RADIOBUTTON_H diff --git a/public/vgui_controls/RichText.h b/public/vgui_controls/RichText.h new file mode 100644 index 0000000..704ef08 --- /dev/null +++ b/public/vgui_controls/RichText.h @@ -0,0 +1,297 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef RICHTEXT_H +#define RICHTEXT_H + +#ifdef _WIN32 +#pragma once +#endif + +#include <vgui_controls/Panel.h> +#include <utlvector.h> + +namespace vgui +{ + +class ClickPanel; + +//----------------------------------------------------------------------------- +// Purpose: Non-editable display of a rich text control +//----------------------------------------------------------------------------- +class RichText : public Panel +{ + DECLARE_CLASS_SIMPLE( RichText, Panel ); + +public: + RichText(Panel *parent, const char *panelName); + ~RichText(); + + // text manipulation + virtual void SetText(const char *text); + virtual void SetText(const wchar_t *text); + void GetText(int offset, OUT_Z_BYTECAP(bufLenInBytes) wchar_t *buf, int bufLenInBytes); + void GetText(int offset, OUT_Z_BYTECAP(bufLenInBytes) char *pch, int bufLenInBytes); + + // configuration + void SetFont(HFont font); + + // inserts characters at the end of the stream + void InsertChar(wchar_t ch); + void InsertString(const char *text); + void InsertString(const wchar_t *wszText); + + // selection + void SelectNone(); + void SelectAllText(); + void SelectNoText(); + MESSAGE_FUNC( CutSelected, "DoCutSelected" ); + MESSAGE_FUNC( CopySelected, "DoCopySelected" ); + + // sets the RichText control interactive or not (meaning you can select/copy text in the window) + void SetPanelInteractive( bool bInteractive ){ m_bInteractive = bInteractive; } + + // sets the RichText scrollbar invisible if it's not going to be used + void SetUnusedScrollbarInvisible( bool bInvis ){ m_bUnusedScrollbarInvis = bInvis; } + + // cursor movement + void GotoTextStart(); // go to start of text buffer + void GotoTextEnd(); // go to end of text buffer + + // configuration + // sets visibility of scrollbar + void SetVerticalScrollbar(bool state); + // sets limit of number of characters insertable into field; set to -1 to remove maximum + // only works with if rich-edit is NOT enabled + void SetMaximumCharCount(int maxChars); + + // rich edit commands + void InsertColorChange(Color col); + // IndentChange doesn't take effect until the next newline character + void InsertIndentChange(int pixelsIndent); + // clickable text + // notification that text was clicked is through "TextClicked" message + void InsertClickableTextStart( const char *pchClickAction = NULL ); + void InsertClickableTextEnd(); + // inserts a string that needs to be scanned for urls/mailto commands to be made clickable + void InsertPossibleURLString(const char *text, Color URLTextColor, Color normalTextColor); + + void InsertFade( float flSustain, float flLength ); + + void ResetAllFades( bool bHold, bool bOnlyExpired = false, float flNewSustain = -1.0f ); + + // sets the height of the window so all text is visible. + // used by tooltips + void SetToFullHeight(); + int GetNumLines(); + + /* CUSTOM MESSAGE HANDLING + "SetText" + input: "text" - text is set to be this string + */ + + /* MESSAGE SENDING (to action signal targets) + "TextChanged" - sent when the text is edited by the user + + + "TextClicked" - sent when clickable text has been clicked on + "text" - the text that was clicked on + */ + + virtual bool RequestInfo(KeyValues *outputData); + /* INFO HANDLING + "GetText" + returns: + "text" - text contained in the text box + */ + virtual void SetFgColor( Color color ); + virtual void SetDrawOffsets( int ofsx, int ofsy ); + bool IsScrollbarVisible(); + + // sets how URL's are handled + // if set, a "URLClicked" "url" "<data>" message will be sent to that panel + void SetURLClickedHandler( Panel *pPanelToHandleClickMsg ); + + void SetUnderlineFont( HFont font ); + + bool IsAllTextAlphaZero() const; + bool HasText() const; + + void SetDrawTextOnly(); + +protected: + virtual void OnThink(); + virtual void PerformLayout(); // layout the text in the window + virtual void ApplySchemeSettings(IScheme *pScheme); + virtual void Paint(); + + virtual void ApplySettings( KeyValues *inResourceData ); + virtual void GetSettings( KeyValues *outResourceData ); + virtual const char *GetDescription( void ); + MESSAGE_FUNC_WCHARPTR( OnSetText, "SetText", text ); + MESSAGE_FUNC( OnSliderMoved, "ScrollBarSliderMoved" ); // respond to scroll bar events + virtual void OnKillFocus(); + virtual void OnMouseWheeled(int delta); // respond to mouse wheel events + virtual void OnKeyCodeTyped(KeyCode code); //respond to keyboard events + + MESSAGE_FUNC_INT( OnClickPanel, "ClickPanel", index); + + virtual void OnCursorMoved(int x, int y); // respond to moving the cursor with mouse button down + virtual void OnMousePressed(MouseCode code); // respond to mouse down events + virtual void OnMouseDoublePressed(MouseCode code); + virtual void OnMouseReleased(MouseCode code); // respond to mouse up events + + virtual void OnMouseFocusTicked(); // do while window has mouse focus + virtual void OnCursorEntered(); // handle cursor entering window + virtual void OnCursorExited(); // handle cursor exiting window + + virtual void OnMouseCaptureLost(); + virtual void OnSizeChanged(int newWide, int newTall); + virtual void OnSetFocus(); + + // clickable url handling + int ParseTextStringForUrls(const char *text, int startPos, char *pchURLText, int cchURLText, char *pchURL, int cchURL, bool &clickable); + virtual void OnTextClicked(const wchar_t *text); + +#ifdef DBGFLAG_VALIDATE + virtual void Validate( CValidator &validator, char *pchName ); +#endif // DBGFLAG_VALIDATE + +protected: + ScrollBar *_vertScrollBar; // the scroll bar used in the window + +private: + int GetLineHeight(); + HFont GetDefaultFont(); + + const wchar_t *ResolveLocalizedTextAndVariables( char const *pchLookup, OUT_Z_BYTECAP(outbufsizeinbytes) wchar_t *outbuf, size_t outbufsizeinbytes ); + void CheckRecalcLineBreaks(); + + void GotoWordRight(); // move cursor to start of next word + void GotoWordLeft(); // move cursor to start of prev word + + void TruncateTextStream(); + bool GetSelectedRange(int& cx0,int& cx1); + void CursorToPixelSpace(int cursorPos, int &cx, int &cy); + int PixelToCursorSpace(int cx, int cy); + void AddAnotherLine(int &cx, int &cy); + void RecalculateDefaultState(int startIndex); + + void LayoutVerticalScrollBarSlider(); + void OpenEditMenu(); + void FinishingURL(int x, int y); + // Returns the character index the drawing should Start at + int GetStartDrawIndex(int &lineBreakIndexIndex); + int GetCursorLine(); + int GetClickableTextIndexStart(int startIndex); + void CreateEditMenu(); // create copy/cut/paste menu + + MESSAGE_FUNC_INT( MoveScrollBar, "MoveScrollBar", delta ); + MESSAGE_FUNC_INT( MoveScrollBarDirect, "MoveScrollBarDirect", delta ); + + // linebreak stream functions + void InvalidateLineBreakStream(); + void RecalculateLineBreaks(); + + struct TFade + { + float flFadeStartTime; + float flFadeLength; + float flFadeSustain; + int iOriginalAlpha; + }; + + // format stream - describes changes in formatting for the text stream + struct TFormatStream + { + // render state + Color color; + int pixelsIndent; + bool textClickable; + CUtlSymbol m_sClickableTextAction; + + TFade fade; + + // position in TextStream that these changes take effect + int textStreamIndex; + }; + + bool m_bResetFades; + bool m_bInteractive; + bool m_bUnusedScrollbarInvis; + bool m_bAllTextAlphaIsZero; + + // data + CUtlVector<wchar_t> m_TextStream; // the text in the text window is stored in this buffer + CUtlVector<int> m_LineBreaks; // an array that holds the index in the buffer to wrap lines at + CUtlVector<TFormatStream> m_FormatStream; // list of format changes + + bool m_bRecalcLineBreaks; + + int _recalculateBreaksIndex; // tells next linebreakindex index to Start recalculating line breaks + bool _invalidateVerticalScrollbarSlider; + int _cursorPos; // the position in the text buffer of the blinking cursor + bool _mouseSelection; // whether we are highlighting text or not (selecting text) + bool _mouseDragSelection; // tells weather mouse is outside window and button is down so we select text + int _select[2]; // select[1] is the offset in the text to where the cursor is currently + // select[0] is the offset to where the cursor was dragged to. or -1 if no drag. + int _pixelsIndent; + int _maxCharCount; // max number of chars that can be in the text buffer + HFont _font; // font of chars in the text buffer + HFont m_hFontUnderline; + Color _selectionColor; + Color _selectionTextColor; // color of the highlighted text + bool _currentTextClickable; + CUtlVector<ClickPanel *> _clickableTextPanels; + int _clickableTextIndex; + Color _defaultTextColor; + int _drawOffsetX; + int _drawOffsetY; + + Panel *m_pInterior; + PHandle m_hPanelToHandleClickingURLs; + + + // sub-controls + Menu *m_pEditMenu; // cut/copy/paste popup + + char *m_pszInitialText; // initial text + + // saved state + bool _recalcSavedRenderState; + + struct TRenderState + { + // rendering positions + int x, y; + + // basic state + Color textColor; + int pixelsIndent; + bool textClickable; + + // index into our current position in the formatting stream + int formatStreamIndex; + }; + TRenderState m_CachedRenderState; // cached render state for the beginning of painting + + // updates a render state based on the formatting and color streams + // returns true if any state changed + bool UpdateRenderState(int textStreamPos, TRenderState &renderState); + void CalculateFade( TRenderState &renderState ); + + void GenerateRenderStateForTextStreamIndex(int textStreamIndex, TRenderState &renderState); + int FindFormatStreamIndexForTextStreamPos(int textStreamIndex); + + // draws a string of characters with the same formatting using the current render state + int DrawString(int iFirst, int iLast, TRenderState &renderState, HFont font); +}; + +} // namespace vgui + + +#endif // RICHTEXT_H diff --git a/public/vgui_controls/RotatingProgressBar.h b/public/vgui_controls/RotatingProgressBar.h new file mode 100644 index 0000000..400838c --- /dev/null +++ b/public/vgui_controls/RotatingProgressBar.h @@ -0,0 +1,67 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef ROTATINGPROGRESSBAR_H +#define ROTATINGPROGRESSBAR_H + +#ifdef _WIN32 +#pragma once +#endif + +#include <vgui/VGUI.h> +#include <vgui_controls/Panel.h> +#include <vgui_controls/ProgressBar.h> + +namespace vgui +{ + + //----------------------------------------------------------------------------- + // Purpose: Progress Bar that rotates an image around its center + //----------------------------------------------------------------------------- + class RotatingProgressBar : public ProgressBar + { + DECLARE_CLASS_SIMPLE( RotatingProgressBar, ProgressBar ); + + public: + RotatingProgressBar(Panel *parent, const char *panelName); + ~RotatingProgressBar(); + + virtual void ApplySettings(KeyValues *inResourceData); + virtual void ApplySchemeSettings(IScheme *pScheme); + + void SetImage( const char *imageName ); + + protected: + virtual void Paint(); + virtual void PaintBackground(); + virtual void OnTick(); + + private: + int m_nTextureId; + char *m_pszImageName; + + float m_flStartRadians; + float m_flEndRadians; + + float m_flLastAngle; + + float m_flTickDelay; + float m_flApproachSpeed; + + float m_flRotOriginX; + float m_flRotOriginY; + + float m_flRotatingX; + float m_flRotatingY; + float m_flRotatingWide; + float m_flRotatingTall; + + }; + +} // namespace vgui + +#endif // ROTATINGPROGRESSBAR_H
\ No newline at end of file diff --git a/public/vgui_controls/ScalableImagePanel.h b/public/vgui_controls/ScalableImagePanel.h new file mode 100644 index 0000000..7c4f1b7 --- /dev/null +++ b/public/vgui_controls/ScalableImagePanel.h @@ -0,0 +1,59 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef SCALABLEIMAGEPANEL_H +#define SCALABLEIMAGEPANEL_H + +#ifdef _WIN32 +#pragma once +#endif + +#include <vgui/VGUI.h> +#include <vgui_controls/Panel.h> + +namespace vgui +{ + //----------------------------------------------------------------------------- + // Purpose: 9-way Segmented background + //----------------------------------------------------------------------------- + class ScalableImagePanel : public Panel + { + DECLARE_CLASS_SIMPLE( ScalableImagePanel, Panel ); + public: + ScalableImagePanel(Panel *parent, const char *name); + ~ScalableImagePanel(); + + virtual void SetImage(const char *imageName); + void SetDrawColor( Color color ) { m_DrawColor = color; } + + protected: + virtual void PaintBackground(); + virtual void GetSettings(KeyValues *outResourceData); + virtual void ApplySettings(KeyValues *inResourceData); + virtual void PerformLayout( void ); + virtual const char *GetDescription(); + + private: + int m_iSrcCornerHeight; // in pixels, how tall is the corner inside the image + int m_iSrcCornerWidth; // same for width + int m_iCornerHeight; // output size of the corner height in pixels + int m_iCornerWidth; // same for width + + int m_iTextureID; + + float m_flCornerWidthPercent; // corner width as percentage of image width + float m_flCornerHeightPercent; // same for height + + char *m_pszImageName; + + char *m_pszDrawColorName; + Color m_DrawColor; + }; + +} // namespace vgui + +#endif // SCALABLEIMAGEPANEL_H diff --git a/public/vgui_controls/ScrollBar.h b/public/vgui_controls/ScrollBar.h new file mode 100644 index 0000000..c22e3a5 --- /dev/null +++ b/public/vgui_controls/ScrollBar.h @@ -0,0 +1,133 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef SCROLLBAR_H +#define SCROLLBAR_H + +#ifdef _WIN32 +#pragma once +#endif + +#include <vgui/VGUI.h> +#include <vgui_controls/Panel.h> + +namespace vgui +{ + +class Button; +class ScrollBarSlider; + +//----------------------------------------------------------------------------- +// Purpose: Generic scrollbar +// Uses Buttons & SliderBars for the main functionality +//----------------------------------------------------------------------------- +class ScrollBar : public Panel +{ + DECLARE_CLASS_SIMPLE( ScrollBar, Panel ); + +public: + ScrollBar(Panel *parent, const char *panelName, bool vertical); + + // Set the value of the scroll bar slider. + virtual void SetValue(int value); + + // Get the value of the scroll bar slider. + virtual int GetValue(); + + // Set the rangeof numbers the slider can scroll through + virtual void SetRange(int min,int max); + + virtual void GetRange(int &min, int &max); + + // Set how many lines are displayed at one time + // in the window the scroll bar is attached to. + virtual void SetRangeWindow(int rangeWindow); + + // Get how many lines are displayed at one time + // in the window the scroll bar is attached to. + virtual int GetRangeWindow(); + + // Check if the scrollbar is vertical or horizontal + virtual bool IsVertical(); + + // Purpose: Check if the slider can move through one or more pixels per + // unit of its range. + virtual bool HasFullRange(); + + // Setup the indexed scroll bar button with the input params. + virtual void SetButton(Button* button,int index); + // Return the indexed scroll bar button + virtual Button *GetButton(int index); + // Set up the slider. + virtual void SetSlider(ScrollBarSlider* slider); + // Return a pointer to the slider. + virtual ScrollBarSlider *GetSlider(); + // Set how far the scroll bar slider moves + // when a scroll bar button is pressed + virtual void SetButtonPressedScrollValue(int value); + + virtual void Validate(); + + // Update and look for clicks when mouse is in the scroll bar window. + virtual void OnMouseFocusTicked(); + + // Set the slider's Paint border enabled. + virtual void SetPaintBorderEnabled(bool state); + // Set the slider's Paint background enabled. + virtual void SetPaintBackgroundEnabled(bool state); + // Set the slider's Paint enabled. + virtual void SetPaintEnabled(bool state); + + // Sets the scrollbar buttons visible or not + virtual void SetScrollbarButtonsVisible(bool visible); + + void SetAutohideButtons( bool bAutohide ) { m_bAutoHideButtons = bAutohide; } + + void UseImages( const char *pszUpArrow, const char *pszDownArrow, const char *pszLine, const char *pszBox ); + + /* MESSAGES SENT: + "ScrollBarSliderMoved" + "position" - new value of the slider + */ + + void SetOverriddenButtons( Button *pB1, Button *pB2 ) { m_pOverriddenButtons[0] = pB1; m_pOverriddenButtons[1] = pB2; } + + virtual void ApplySettings( KeyValues *pInResourceData ); + +protected: + + virtual void PerformLayout(); + virtual void SendSliderMoveMessage(int value); + virtual void ApplySchemeSettings(IScheme *pScheme); + virtual void OnSizeChanged(int wide, int tall); + + MESSAGE_FUNC_INT( OnSliderMoved, "ScrollBarSliderMoved", position ); + virtual void RespondToScrollArrow(int const direction); + + virtual void UpdateButtonsForImages( void ); + virtual void UpdateSliderImages( void ); + Button *GetDepressedButton( int iIndex ); + +private: + Button* _button[2]; + ScrollBarSlider* _slider; + int _buttonPressedScrollValue; + int _scrollDelay; // used to control delays in scrolling + bool _respond; + bool m_bNoButtons; + CPanelAnimationVar( bool, m_bAutoHideButtons, "autohide_buttons", "0" ); + + vgui::ImagePanel *m_pUpArrow; + vgui::ImagePanel *m_pLine; + vgui::ImagePanel *m_pDownArrow; + vgui::ImagePanel *m_pBox; + Button *m_pOverriddenButtons[2]; +}; + +} + +#endif // SCROLLBAR_H diff --git a/public/vgui_controls/ScrollBarSlider.h b/public/vgui_controls/ScrollBarSlider.h new file mode 100644 index 0000000..8769222 --- /dev/null +++ b/public/vgui_controls/ScrollBarSlider.h @@ -0,0 +1,94 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//===========================================================================// + +#ifndef SCROLLBARSLIDER_H +#define SCROLLBARSLIDER_H + +#ifdef _WIN32 +#pragma once +#endif + +#include <vgui/VGUI.h> +#include <vgui_controls/Panel.h> + +namespace vgui +{ + +class IBorder; + +//----------------------------------------------------------------------------- +// Purpose: ScrollBarSlider bar, as used in ScrollBar's +//----------------------------------------------------------------------------- +class ScrollBarSlider : public Panel +{ + DECLARE_CLASS_SIMPLE( ScrollBarSlider, Panel ); + +public: + ScrollBarSlider(Panel *parent, const char *panelName, bool vertical); + + // Set the ScrollBarSlider value of the nob. + virtual void SetValue(int value); + virtual int GetValue(); + + // Check whether the scroll bar is vertical or not + virtual bool IsVertical(); + + // Set max and min range of lines to display + virtual void SetRange(int min, int max); + + virtual void GetRange(int &min, int &max); + + // Set number of rows that can be displayed in window + virtual void SetRangeWindow(int rangeWindow); + + // Get number of rows that can be displayed in window + virtual int GetRangeWindow(); + + // Set the size of the ScrollBarSlider nob + virtual void SetSize(int wide, int tall); + + // Get current ScrollBarSlider bounds + virtual void GetNobPos(int &min, int &max); + + virtual bool HasFullRange(); + virtual void SetButtonOffset(int buttonOffset); + virtual void OnCursorMoved(int x, int y); + virtual void OnMousePressed(MouseCode code); + virtual void OnMouseDoublePressed(MouseCode code); + virtual void OnMouseReleased(MouseCode code); + + // Return true if this slider is actually drawing itself + virtual bool IsSliderVisible( void ); + + virtual void ApplySettings( KeyValues *pInResourceData ); + +protected: + virtual void Paint(); + virtual void PaintBackground(); + virtual void PerformLayout(); + virtual void ApplySchemeSettings(IScheme *pScheme); + +private: + virtual void RecomputeNobPosFromValue(); + virtual void RecomputeValueFromNobPos(); + virtual void SendScrollBarSliderMovedMessage(); + + bool _vertical; + bool _dragging; + int _nobPos[2]; + int _nobDragStartPos[2]; + int _dragStartPos[2]; + int _range[2]; + int _value; // the position of the ScrollBarSlider, in coordinates as specified by SetRange/SetRangeWindow + int _rangeWindow; + int _buttonOffset; + IBorder *_ScrollBarSliderBorder; +}; + +} // namespace vgui + +#endif // SCROLLBARSLIDER_H diff --git a/public/vgui_controls/ScrollableEditablePanel.h b/public/vgui_controls/ScrollableEditablePanel.h new file mode 100644 index 0000000..6796405 --- /dev/null +++ b/public/vgui_controls/ScrollableEditablePanel.h @@ -0,0 +1,55 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//============================================================================= + +#ifndef SCROLLABLEEDITABLEPANEL_H +#define SCROLLABLEEDITABLEPANEL_H + +#ifdef _WIN32 +#pragma once +#endif + +#include "vgui_controls/EditablePanel.h" + +//----------------------------------------------------------------------------- +// Forward declarations +//----------------------------------------------------------------------------- +namespace vgui +{ + class ScrollBar; +} + +namespace vgui +{ + +//----------------------------------------------------------------------------- +// An editable panel that has a scrollbar +//----------------------------------------------------------------------------- +class ScrollableEditablePanel : public vgui::EditablePanel +{ + DECLARE_CLASS_SIMPLE( ScrollableEditablePanel, vgui::EditablePanel ); + +public: + ScrollableEditablePanel( vgui::Panel *pParent, vgui::EditablePanel *pChild, const char *pName ); + virtual ~ScrollableEditablePanel() {} + + virtual void ApplySettings( KeyValues *pInResourceData ); + virtual void PerformLayout(); + + vgui::ScrollBar *GetScrollbar( void ) { return m_pScrollBar; } + + MESSAGE_FUNC( OnScrollBarSliderMoved, "ScrollBarSliderMoved" ); + virtual void OnMouseWheeled(int delta); // respond to mouse wheel events + +private: + vgui::ScrollBar *m_pScrollBar; + vgui::EditablePanel *m_pChild; +}; + + +} // end namespace vgui + +#endif // SCROLLABLEEDITABLEPANEL_H
\ No newline at end of file diff --git a/public/vgui_controls/SectionedListPanel.h b/public/vgui_controls/SectionedListPanel.h new file mode 100644 index 0000000..dc4b41a --- /dev/null +++ b/public/vgui_controls/SectionedListPanel.h @@ -0,0 +1,351 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef SECTIONEDLISTPANEL_H +#define SECTIONEDLISTPANEL_H + +#ifdef _WIN32 +#pragma once +#endif + +#include <utlvector.h> +#include <utllinkedlist.h> +#include <vgui/VGUI.h> +#include <vgui_controls/Panel.h> +#include <vgui_controls/PHandle.h> +#include <vgui_controls/Label.h> + +namespace vgui +{ + +class SectionedListPanel; +class SectionedListPanelHeader; +class CItemButton; + +// sorting function, should return true if itemID1 should be displayed before itemID2 +typedef bool (*SectionSortFunc_t)(SectionedListPanel *list, int itemID1, int itemID2); + +//----------------------------------------------------------------------------- +// Purpose: List panel control that is divided up into discrete sections +//----------------------------------------------------------------------------- +class SectionedListPanel : public Panel +{ + DECLARE_CLASS_SIMPLE( SectionedListPanel, Panel ); + +public: + SectionedListPanel(vgui::Panel *parent, const char *name); + ~SectionedListPanel(); + + // adds a new section; returns false if section already exists + virtual void AddSection(int sectionID, const char *name, SectionSortFunc_t sortFunc = NULL); + virtual void AddSection(int sectionID, const wchar_t *name, SectionSortFunc_t sortFunc = NULL); + virtual void AddSection(int sectionID, SectionedListPanelHeader *pHeader, SectionSortFunc_t sortFunc = NULL); + + // clears all the sections - leaves the items in place + virtual void RemoveAllSections(); + + // modifies section info + virtual void SetSectionFgColor(int sectionID, Color color); + virtual void SetSectionDividerColor( int sectionID, Color color); + // forces a section to always be visible + virtual void SetSectionAlwaysVisible(int sectionID, bool visible = true); + virtual void SetSectionMinimumHeight(int sectionID, int iMinimumHeight); + + // adds a new column to a section + enum ColumnFlags_e + { + HEADER_IMAGE = 0x01, // set if the header for the column is an image instead of text + COLUMN_IMAGE = 0x02, // set if the column contains an image instead of text (images are looked up by index from the ImageList) (see SetImageList below) + COLUMN_BRIGHT = 0x04, // set if the column text should be the bright color + COLUMN_CENTER = 0x08, // set to center the text/image in the column + COLUMN_RIGHT = 0x10, // set to right-align the text in the column + }; + virtual bool AddColumnToSection(int sectionID, const char *columnName, const char *columnText, int columnFlags, int width, HFont fallbackFont = INVALID_FONT ); + virtual bool AddColumnToSection(int sectionID, const char *columnName, const wchar_t *columnText, int columnFlags, int width, HFont fallbackFont = INVALID_FONT ); + + // modifies the text in an existing column + virtual bool ModifyColumn(int sectionID, const char *columnName, const wchar_t *columnText); + + // adds an item to the list; returns the itemID of the new item + virtual int AddItem(int sectionID, const KeyValues *data); + + // modifies an existing item; returns false if the item does not exist + virtual bool ModifyItem(int itemID, int sectionID, const KeyValues *data); + + // removes an item from the list; returns false if the item does not exist or is already removed + virtual bool RemoveItem(int itemID); + + // clears the list + virtual void RemoveAll() { DeleteAllItems(); } + // DeleteAllItems() is deprecated, use RemoveAll(); + virtual void DeleteAllItems(); + + // set the text color of an item + virtual void SetItemFgColor(int itemID, Color color); + //============================================================================= + // HPE_BEGIN: + // [menglish] Getters and setters for several item and section objects + //============================================================================= + virtual void SetItemBgColor( int itemID, Color color ); + virtual int GetColumnIndexByName(int sectionID, char* name); + virtual int GetLineSpacing() { return m_iLineSpacing; } + //============================================================================= + // HPE_END + //============================================================================= + virtual void SetItemFont( int itemID, HFont font ); + virtual void SetItemEnabled( int itemID, bool bEnabled ); + + /* MESSAGES SENT: + "RowSelected" + "itemID" - the selected item id, -1 if nothing selected + + // when an item has been clicked on + "RowContextMenu" "itemID" + "RowLeftClick" "itemID" + "RowDoubleLeftClick" "itemID" + */ + + // returns the number of columns in a section + virtual int GetColumnCountBySection(int sectionID); + + // returns the name of a column by section and column index; returns NULL if there are no more columns + // valid range of columnIndex is [0, GetColumnCountBySection) + virtual const char *GetColumnNameBySection(int sectionID, int columnIndex); + virtual const wchar_t *GetColumnTextBySection(int sectionID, int columnIndex); + virtual int GetColumnFlagsBySection(int sectionID, int columnIndex); + virtual int GetColumnWidthBySection(int sectionID, int columnIndex); + virtual HFont GetColumnFallbackFontBySection( int sectionID, int columnIndex ); + + // returns the id of the currently selected item, -1 if nothing is selected + virtual int GetSelectedItem(); + + // sets which item is currently selected + virtual void SetSelectedItem(int itemID); + + // remove selection + virtual void ClearSelection( void ); + + // returns the data of a selected item + // InvalidateItem(itemID) needs to be called if the KeyValues are modified + virtual KeyValues *GetItemData(int itemID); + + // returns what section an item is in + virtual int GetItemSection(int itemID); + + // forces an item to redraw (use when keyvalues have been modified) + virtual void InvalidateItem(int itemID); + + // returns true if the itemID is valid for use + virtual bool IsItemIDValid(int itemID); + virtual int GetHighestItemID(); + + // returns the number of items (ignoring section dividers) + virtual int GetItemCount(); + + // returns the item ID from the row, again ignoring section dividers - valid from [0, GetItemCount ) + virtual int GetItemIDFromRow(int row); + + // returns the row that this itemID occupies. -1 if the itemID is invalid + virtual int GetRowFromItemID(int itemID); + + // gets the local coordinates of a cell + virtual bool GetCellBounds(int itemID, int column, int &x, int &y, int &wide, int &tall); + + // Gets the coordinates of a section header + virtual bool GetSectionHeaderBounds(int sectionID, int &x, int &y, int &wide, int &tall); + + //============================================================================= + // HPE_BEGIN: + // [menglish] Get the bounds of an item or column. + //============================================================================= + + // gets the local coordinates of a cell using the max width for every column + virtual bool GetMaxCellBounds(int itemID, int column, int &x, int &y, int &wide, int &tall); + + // gets the local coordinates of an item + virtual bool GetItemBounds(int itemID, int &x, int &y, int &wide, int &tall); + + // [tj] Accessors for clickability + void SetClickable(bool clickable) { m_clickable = clickable; } + bool IsClickable() { return m_clickable; } + + // [tj] Accessors for header drawing + void SetDrawHeaders(bool drawHeaders) { m_bDrawSectionHeaders = drawHeaders; } + bool GetDrawHeaders() { return m_bDrawSectionHeaders; } + + //============================================================================= + // HPE_END + //============================================================================= + + // set up a field for editing + virtual void EnterEditMode(int itemID, int column, vgui::Panel *editPanel); + + // leaves editing mode + virtual void LeaveEditMode(); + + // returns true if we are currently in inline editing mode + virtual bool IsInEditMode(); + + // sets whether or not the vertical scrollbar should ever be displayed + virtual void SetVerticalScrollbar(bool state); + + // returns the size required to fully draw the contents of the panel + virtual void GetContentSize(int &wide, int &tall); + + // image handling + virtual void SetImageList(ImageList *imageList, bool deleteImageListWhenDone); + + virtual void ScrollToItem(int iItem); + + virtual void SetProportional(bool state); + + HFont GetHeaderFont( void ) const; + void SetHeaderFont( HFont hFont ); + HFont GetRowFont( void ) const; + void SetRowFont( HFont hFont ); + void MoveSelectionDown( void ); + void MoveSelectionUp( void ); + + ScrollBar *GetScrollBar( void ) { return m_pScrollBar; } + + void SetColumnWidthBySection(int sectionID, const char *columnName, int iWidth); + +protected: + virtual void PerformLayout(); + virtual void ApplySchemeSettings(IScheme *pScheme); + virtual void ApplySettings(KeyValues *inResourceData); + virtual void OnSizeChanged(int wide, int tall); + virtual void OnMouseWheeled(int delta); + virtual void OnMousePressed( MouseCode code); + virtual void NavigateTo( void ); + virtual void OnKeyCodePressed( KeyCode code ); + virtual void OnSetFocus(); // called after the panel receives the keyboard focus + +public: + virtual void SetFontSection(int sectionID, HFont font); + virtual void SetItemBgHorizFillInset( int itemID, int nInset ); + void SetColorOverrideForCell( int sectionID, int itemID, int columnID, Color clrOverride ); + Color *GetColorOverrideForCell( int sectionID, int itemID, int columnID ); + void ClearAllColorOverrideForCell(){ m_ColorOverrides.Purge(); } + + enum + { + BUTTON_HEIGHT_DEFAULT = 20, + BUTTON_HEIGHT_SPACER = 7, + DEFAULT_LINE_SPACING = 20, + DEFAULT_SECTION_GAP = 8, + COLUMN_DATA_INDENT = 6, + COLUMN_DATA_GAP = 2, + }; + + virtual void SetSectionDrawDividerBar( int sectionID, bool bDraw ); + +private: + MESSAGE_FUNC( OnSliderMoved, "ScrollBarSliderMoved" ); + + int GetSectionTall(); + void LayoutPanels(int &contentTall); + + // Returns the index of a new item button, reusing an existing item button if possible + int GetNewItemButton(); + + friend class CItemButton; + void SetSelectedItem(CItemButton *item); + DHANDLE<CItemButton> m_hSelectedItem; + + struct color_override_t + { + int m_SectionID; + int m_ItemID; + int m_ColumnID; + Color m_clrOverride; + }; + + struct column_t + { + char m_szColumnName[32]; + wchar_t m_szColumnText[64]; + int m_iColumnFlags; + int m_iWidth; + HFont m_hFallbackFont; + }; + struct section_t + { + int m_iID; + bool m_bAlwaysVisible; + SectionedListPanelHeader *m_pHeader; + CUtlVector<column_t> m_Columns; + SectionSortFunc_t m_pSortFunc; + int m_iMinimumHeight; + }; + + CUtlVector<section_t> m_Sections; + CUtlLinkedList<CItemButton *, int> m_Items; + CUtlLinkedList<CItemButton *, int> m_FreeItems; + CUtlVector<CItemButton *> m_SortedItems; + + CUtlVector<color_override_t> m_ColorOverrides; + + PHandle m_hEditModePanel; + int m_iEditModeItemID; + int m_iEditModeColumn; + int m_iContentHeight; + int m_iLineSpacing; // row height + int m_iLineGap; // gap between rows + int m_iSectionGap; + + int FindSectionIndexByID(int sectionID); + void ReSortList(); + + ScrollBar *m_pScrollBar; + ImageList *m_pImageList; + bool m_bDeleteImageListWhenDone; + bool m_bSortNeeded; + bool m_bVerticalScrollbarEnabled; + + HFont m_hHeaderFont; + HFont m_hRowFont; + //============================================================================= + // HPE_BEGIN: + //============================================================================= + // [tj] Whether or not this list should respond to the mouse + bool m_clickable; + // [tj] Whether or not this list should draw the headers for the sections + bool m_bDrawSectionHeaders; + //============================================================================= + // HPE_END + //============================================================================= + + CPanelAnimationVar( bool, m_bShowColumns, "show_columns", "false" ); +}; + +class SectionedListPanelHeader : public Label +{ + DECLARE_CLASS_SIMPLE( SectionedListPanelHeader, Label ); + +public: + SectionedListPanelHeader(SectionedListPanel *parent, const char *name, int sectionID); + SectionedListPanelHeader(SectionedListPanel *parent, const wchar_t *name, int sectionID); + + virtual void ApplySchemeSettings(IScheme *pScheme) OVERRIDE; + virtual void Paint() OVERRIDE; + virtual void PerformLayout() OVERRIDE; + + void SetColor(Color col); + void SetDividerColor(Color col ); + void DrawDividerBar(bool bDraw){ m_bDrawDividerBar = bDraw; } + +protected: + int m_iSectionID; + Color m_SectionDividerColor; + SectionedListPanel *m_pListPanel; + bool m_bDrawDividerBar; +}; + +} // namespace vgui + +#endif // SECTIONEDLISTPANEL_H diff --git a/public/vgui_controls/Slider.h b/public/vgui_controls/Slider.h new file mode 100644 index 0000000..ce75aef --- /dev/null +++ b/public/vgui_controls/Slider.h @@ -0,0 +1,123 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef SLIDER_H +#define SLIDER_H + +#ifdef _WIN32 +#pragma once +#endif + +#include <vgui/VGUI.h> +#include <vgui_controls/Panel.h> + +namespace vgui +{ + +//----------------------------------------------------------------------------- +// Labeled horizontal slider +//----------------------------------------------------------------------------- +class Slider : public Panel +{ + DECLARE_CLASS_SIMPLE( Slider, Panel ); +public: + Slider(Panel *parent, const char *panelName); + + // interface + virtual void SetValue(int value, bool bTriggerChangeMessage = true); + virtual int GetValue(); + virtual void SetRange(int min, int max); // set to max and min range of rows to display + virtual void GetRange(int &min, int &max); + virtual void GetNobPos(int &min, int &max); // get current Slider position + virtual void SetButtonOffset(int buttonOffset); + virtual void OnCursorMoved(int x, int y); + virtual void OnMousePressed(MouseCode code); + virtual void OnMouseDoublePressed(MouseCode code); + virtual void OnMouseReleased(MouseCode code); + virtual void SetTickCaptions(const wchar_t *left, const wchar_t *right); + virtual void SetTickCaptions(const char *left, const char *right); + virtual void SetNumTicks(int ticks); + virtual void SetThumbWidth( int width ); + virtual int EstimateValueAtPos( int localMouseX, int localMouseY ); + virtual void SetInverted( bool bInverted ); + + // If you click on the slider outside of the nob, the nob jumps + // to the click position, and if this setting is enabled, the nob + // is then draggable from the new position until the mouse is released + virtual void SetDragOnRepositionNob( bool state ); + virtual bool IsDragOnRepositionNob() const; + + // Get if the slider nob is being dragged by user, usually the application + // should refuse from forcefully setting slider value if it is being dragged + // by user since the next frame the nob will pop back to mouse position + virtual bool IsDragged( void ) const; + + // This allows the slider to behave like it's larger than what's actually being drawn + virtual void SetSliderThumbSubRange( bool bEnable, int nMin = 0, int nMax = 100 ); + +protected: + virtual void OnSizeChanged(int wide, int tall); + virtual void Paint(); + virtual void PaintBackground(); + virtual void PerformLayout(); + virtual void ApplySchemeSettings(IScheme *pScheme); + virtual void GetSettings(KeyValues *outResourceData); + virtual void ApplySettings(KeyValues *inResourceData); + virtual const char *GetDescription(); +#ifdef _X360 + virtual void OnKeyCodePressed(KeyCode code); +#endif + virtual void OnKeyCodeTyped(KeyCode code); + + virtual void DrawNob(); + virtual void DrawTicks(); + virtual void DrawTickLabels(); + + virtual void GetTrackRect( int &x, int &y, int &w, int &h ); + +protected: + virtual void RecomputeNobPosFromValue(); + virtual void RecomputeValueFromNobPos(); + + virtual void SendSliderMovedMessage(); + virtual void SendSliderDragStartMessage(); + virtual void SendSliderDragEndMessage(); + + void ClampRange(); + + bool _dragging; + int _nobPos[2]; + int _nobDragStartPos[2]; + int _dragStartPos[2]; + int _range[2]; + int _subrange[ 2 ]; + int _value; // the position of the Slider, in coordinates as specified by SetRange/SetRangeWindow + int _buttonOffset; + IBorder *_sliderBorder; + IBorder *_insetBorder; + float _nobSize; + + TextImage *_leftCaption; + TextImage *_rightCaption; + + Color m_TickColor; + Color m_TrackColor; + Color m_DisabledTextColor1; + Color m_DisabledTextColor2; +#ifdef _X360 + Color m_DepressedBgColor; +#endif + + int m_nNumTicks; + bool m_bIsDragOnRepositionNob : 1; + bool m_bUseSubRange : 1; + bool m_bInverted : 1; +}; + +} + +#endif // SLIDER_H diff --git a/public/vgui_controls/Splitter.h b/public/vgui_controls/Splitter.h new file mode 100644 index 0000000..f788ebc --- /dev/null +++ b/public/vgui_controls/Splitter.h @@ -0,0 +1,98 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//===========================================================================// + +#ifndef SPLITTER_H +#define SPLITTER_H + +#ifdef _WIN32 +#pragma once +#endif + +#include <vgui_controls/EditablePanel.h> + +namespace vgui +{ + +enum SplitterMode_t +{ + SPLITTER_MODE_HORIZONTAL = 0, + SPLITTER_MODE_VERTICAL +}; + + +class SplitterHandle; +class SplitterChildPanel; + +//----------------------------------------------------------------------------- +// Purpose: Thin line used to divide sections, can be moved dragged! +//----------------------------------------------------------------------------- +class Splitter : public EditablePanel +{ + DECLARE_CLASS_SIMPLE( Splitter, EditablePanel ); + +public: + // nCount is the number of splitters to create. + // NOTE: The constructor here will create (nCount+1) EditablePanel children + // and name them child0...childN for .res file purposes. + Splitter( Panel *parent, const char *name, SplitterMode_t mode, int nCount ); + ~Splitter(); + + // Evenly respace all splitters + void EvenlyRespaceSplitters(); + + // respace splitters using given fractions (must sum to 1) + void RespaceSplitters( float *flFractions ); + + // Inherited from Panel + virtual void ApplySettings(KeyValues *inResourceData); + virtual void GetSettings( KeyValues *outResourceData ); + virtual void PerformLayout(); + virtual void OnSizeChanged(int newWide, int newTall); + virtual void ApplyUserConfigSettings(KeyValues *userConfig); + virtual void GetUserConfigSettings(KeyValues *userConfig); + virtual bool HasUserConfigSettings() { return true; } + + // Sets the splitter color + void SetSplitterColor( Color c ); + + // Enables borders on the splitters + void EnableBorders( bool bEnable ); + + // Locks the size of a particular child in pixels. + void LockChildSize( int nChildIndex, int nSize ); + void UnlockChildSize( int nChildIndex ); + +private: + void RecreateSplitters( int nCount ); + + struct SplitterInfo_t + { + SplitterChildPanel *m_pPanel; // This panel is to the left or above the handle + SplitterHandle *m_pHandle; + float m_flPos; + bool m_bLocked; + int m_nLockedSize; + }; + + int GetPosRange(); + int GetSplitterCount() const; + int GetSplitterPosition( int nIndex ); + void SetSplitterPosition( int nIndex, int nPos ); + int GetSubPanelCount() const; + int ComputeLockedSize( int nStartingIndex ); + + CUtlVector< SplitterInfo_t > m_Splitters; + SplitterMode_t m_Mode; + + friend class SplitterHandle; +}; + + +} // namespace vgui + + +#endif // SPLITTER_H diff --git a/public/vgui_controls/TextEntry.h b/public/vgui_controls/TextEntry.h new file mode 100644 index 0000000..7231acc --- /dev/null +++ b/public/vgui_controls/TextEntry.h @@ -0,0 +1,390 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: A Class to create a window that you can type and edit text in. +// Window can hold single line or multiline text. +// If it is single it can scroll horizontally in response to +// key input and mouse selection. +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef TEXTENTRY_H +#define TEXTENTRY_H + +#ifdef _WIN32 +#pragma once +#endif + +#include <vgui/VGUI.h> +#include <Color.h> +#include <vgui_controls/Panel.h> +#include <vgui_controls/Label.h> +#include <vgui_controls/ListPanel.h> + +#include <utlvector.h> + +namespace vgui +{ + +//----------------------------------------------------------------------------- +// Purpose: Text-input handler +// Behaviour Specs: +// This class handles input from mouse and keyboard. +// TextEntry classes support several box styles, horizontal scrolling with no scrollbar +// vertical scrolling with or without a scrollbar, single line, multiline, +// editable and noneditable. +// +// Shared behaviour: +// URL's are a different text color and are clickable. Clicking them brings up a web browser. +// For vertical scroll bars, up and down arrows scroll one line at a time. +// Clicking and dragging the nob scrolls through text lines. +// Mouse wheel also moves the nob. +// User can select and highlight text in the window. +// Double clicking on a word selects it. +// +// Non editable: +// No blinking cursor in non editable windows. +// Right clicking mouse opens copy menu. Menu's top left corner is where mouse is. +// Ctrl-c will also copy the text. +// Editable: +// Blinking cursor is positioned where text will be inserted. +// Text keys type chars in the window. +// ctrl-c copy highlighted text +// ctrl-v paste highlighted text +// ctrl-x cut highlighted text +// ctrl-right arrow move cursor to the start of the next word +// ctrl-left arrow move cursor to the start of the prev word +// ctrl-enter delete the selected text (and inserts a newline if _catchEnterKey is true) +// insert delete selected text and pastes text from the clipboard +// delete delete the selected text +// ctrl-home move cursor to the start of the text +// ctrl-end move cursor to the end of the text. +// left arrow move cursor before prev char +// ctrl-shift left/right arrow selects text a word at a time +// right arrow move cursor before next char +// up arrow move cursor up one line. +// down arrow move cursor down one line. +// home move cursor to start of current line +// end move cursor to end of current line +// backspace delete prev char or selected text. +// Trying to move to the prev/next char/line/word when there is none moves the cursor to the +// start/end of the text. +// Horizontal scrolling: +// Trying to move to the prev/next char/line/word when there is none scrolls the text +// horizontally in the window so the new text displays at the correct side. +// When moving to prev chars scrolling is staggered. To next chars it is one char at a time. +// Cut/Copy/Paste Menu: +// Right clicking mouse brings up cut/copy/paste menu. +// If no text is highlighted the cut/copy options are dimmed. Cut is dimmed in non editable panels +// If there is no text in the clipboard or panel is not editable the paste option is dimmed. +// If the mouse is right clicked over selected text, the text stays selected. +// If the mouse is right clicked over unselected text, any selected text is deselected. +// +// +//----------------------------------------------------------------------------- +class TextEntry : public Panel +{ + DECLARE_CLASS_SIMPLE( TextEntry, Panel ); + +public: + TextEntry(Panel *parent, const char *panelName); + virtual ~TextEntry(); + + virtual void SetText(const wchar_t *wszText); + virtual void SetText(const char *text); + virtual void GetText(OUT_Z_BYTECAP(bufLenInBytes) char *buf, int bufLenInBytes); + virtual void GetText(OUT_Z_BYTECAP(bufLenInBytes) wchar_t *buf, int bufLenInBytes); + virtual int GetTextLength() const; + virtual bool IsTextFullySelected() const; + + // editing + virtual void GotoLeft(); // move cursor one char left + virtual void GotoRight(); // move cursor one char right + virtual void GotoUp(); // move cursor one line up + virtual void GotoDown(); // move cursor one line down + virtual void GotoWordRight(); // move cursor to Start of next word + virtual void GotoWordLeft(); // move cursor to Start of prev word + virtual void GotoFirstOfLine(); // go to Start of the current line + virtual void GotoEndOfLine(); // go to end of the current line + virtual void GotoTextStart(); // go to Start of text buffer + virtual void GotoTextEnd(); // go to end of text buffer + + virtual void InsertChar(wchar_t ch); + virtual void InsertString(const char *text); + virtual void InsertString(const wchar_t *wszText); + virtual void Backspace(); + virtual void Delete(); + virtual void SelectNone(); + virtual void OpenEditMenu(); + MESSAGE_FUNC( CutSelected, "DoCutSelected" ); + MESSAGE_FUNC( CopySelected, "DoCopySelected" ); + MESSAGE_FUNC( Paste, "DoPaste" ); + + MESSAGE_FUNC_INT( LanguageChanged, "DoLanguageChanged", handle ); + MESSAGE_FUNC_INT( ConversionModeChanged, "DoConversionModeChanged", handle ); + MESSAGE_FUNC_INT( SentenceModeChanged, "DoSentenceModeChanged", handle ); + + MESSAGE_FUNC_WCHARPTR( CompositionString, "DoCompositionString", string ); + + MESSAGE_FUNC( ShowIMECandidates, "DoShowIMECandidates" ); + MESSAGE_FUNC( HideIMECandidates, "DoHideIMECandidates" ); + MESSAGE_FUNC( UpdateIMECandidates, "DoUpdateIMECandidates" ); + + virtual void DeleteSelected(); + virtual void Undo(); + virtual void SaveUndoState(); + virtual void SetFont(HFont font); + virtual void SetTextHidden(bool bHideText); + virtual void SetEditable(bool state); + virtual bool IsEditable(); + virtual void SetEnabled(bool state); + // move the cursor to line 'line', given how many pixels are in a line + virtual void MoveCursor(int line, int pixelsAcross); + + // sets the color of the background when the control is disabled + virtual void SetDisabledBgColor(Color col); + + // set whether the box handles more than one line of entry + virtual void SetMultiline(bool state); + virtual bool IsMultiline(); + + // sets visibility of scrollbar + virtual void SetVerticalScrollbar(bool state); + + // sets whether or not the edit catches and stores ENTER key presses + virtual void SetCatchEnterKey(bool state); + + // sets whether or not to send "TextNewLine" msgs when ENTER key is pressed + virtual void SendNewLine(bool send); + + // sets limit of number of characters insertable into field; set to -1 to remove maximum + // only works with if rich-edit is NOT enabled + virtual void SetMaximumCharCount(int maxChars); + virtual int GetMaximumCharCount(); + virtual void SetAutoProgressOnHittingCharLimit(bool state); + + // sets whether to wrap text once maxChars is reached (on a line by line basis) + virtual void SetWrap(bool wrap); + + virtual void RecalculateLineBreaks(); + virtual void LayoutVerticalScrollBarSlider(); + + virtual bool RequestInfo(KeyValues *outputData); + + // sets the height of the window so all text is visible. + // used by tooltips + void SetToFullHeight(); + + // sets the width of the window so all text is visible. (will create one line) + // used by tooltips + void SetToFullWidth(); + + int GetNumLines(); + + /* INFO HANDLING + "GetText" + returns: + "text" - text contained in the text box + */ + + /* CUSTOM MESSAGE HANDLING + "SetText" + input: "text" - text is set to be this string + */ + + /* MESSAGE SENDING (to action signal targets) + "TextChanged" - sent when the text is edited by the user + + "TextNewLine" - sent when the end key is pressed in the text entry AND _sendNewLines is true + + "TextKillFocus" - sent when focus leaves textentry field + */ + + // Selects all the text in the text entry. + void SelectAllText(bool bResetCursorPos); + void SelectNoText(); + void SelectAllOnFirstFocus( bool status ); + void SetDrawWidth(int width); // width from right side of window we have to draw in + int GetDrawWidth(); + void SetHorizontalScrolling(bool status); // turn horizontal scrolling on or off. + + // sets whether non-asci characters (unicode chars > 127) are allowed in the control - defaults to OFF + void SetAllowNonAsciiCharacters(bool state); + + // sets whether or not number input only is allowed + void SetAllowNumericInputOnly(bool state); + + // By default, we draw the language shortname on the right hand side of the control + void SetDrawLanguageIDAtLeft( bool state ); + + virtual bool GetDropContextMenu( Menu *menu, CUtlVector< KeyValues * >& data ); + virtual bool IsDroppable( CUtlVector< KeyValues * >& data ); + virtual void OnPanelDropped( CUtlVector< KeyValues * >& data ); + virtual Panel *GetDragPanel(); + virtual void OnCreateDragData( KeyValues *msg ); + + void SelectAllOnFocusAlways( bool status ); + void SetSelectionTextColor( const Color& clr ); + void SetSelectionBgColor( const Color& clr ); + void SetSelectionUnfocusedBgColor( const Color& clr ); + + void SetUseFallbackFont( bool bState, HFont hFallback ); + +protected: + virtual void ResetCursorBlink(); + virtual void PerformLayout(); // layout the text in the window + virtual void ApplySchemeSettings(IScheme *pScheme); + virtual void PaintBackground(); + virtual int DrawChar(wchar_t ch, HFont font, int index, int x, int y); + virtual bool DrawCursor(int x, int y); + + virtual void SetCharAt(wchar_t ch, int index); // set the value of a char in the text buffer + virtual void ApplySettings( KeyValues *inResourceData ); + virtual void GetSettings( KeyValues *outResourceData ); + virtual const char *GetDescription( void ); + virtual void FireActionSignal(); + virtual bool GetSelectedRange(int& cx0,int& cx1); + virtual void CursorToPixelSpace(int cursorPos, int &cx, int &cy); + virtual int PixelToCursorSpace(int cx, int cy); + virtual void AddAnotherLine(int &cx, int &cy); + virtual int GetYStart(); // works out ypixel position drawing started at + + virtual bool SelectCheck( bool fromMouse = false ); // check if we are in text selection mode + MESSAGE_FUNC_WCHARPTR( OnSetText, "SetText", text ); + MESSAGE_FUNC( OnSliderMoved, "ScrollBarSliderMoved" ); // respond to scroll bar events + virtual void OnKillFocus(); + virtual void OnMouseWheeled(int delta); // respond to mouse wheel events + virtual void OnKeyCodePressed(KeyCode code); //respond to keyboard events + virtual void OnKeyCodeTyped(KeyCode code); //respond to keyboard events + virtual void OnKeyTyped(wchar_t unichar); //respond to keyboard events + + virtual void OnCursorMoved(int x, int y); // respond to moving the cursor with mouse button down + virtual void OnMousePressed(MouseCode code); // respond to mouse down events + virtual void OnMouseDoublePressed( MouseCode code ); + virtual void OnMouseTriplePressed( MouseCode code ); + virtual void OnMouseReleased( MouseCode code ); // respond to mouse up events + + virtual void OnKeyFocusTicked(); // do while window has keyboard focus + virtual void OnMouseFocusTicked(); // do while window has mouse focus + virtual void OnCursorEntered(); // handle cursor entering window + virtual void OnCursorExited(); // handle cursor exiting window + + virtual void OnMouseCaptureLost(); + virtual void OnSizeChanged(int newWide, int newTall); + + // Returns the character index the drawing should Start at + virtual int GetStartDrawIndex(int &lineBreakIndexIndex); + +public: + // helper accessors for common gets + virtual float GetValueAsFloat(); + virtual int GetValueAsInt(); + +protected: + void ScrollRight(); // scroll to right until cursor is visible + void ScrollLeft(); // scroll to left + bool IsCursorOffRightSideOfWindow(int cursorPos); // check if cursor is off right side of window + bool IsCursorOffLeftSideOfWindow(int cursorPos); // check if cursor is off left side of window + void ScrollLeftForResize(); + + void OnSetFocus(); + // Change keyboard layout type + void OnChangeIME( bool forward ); + + bool NeedsEllipses( HFont font, int *pIndex ); + +private: + MESSAGE_FUNC_INT( OnSetState, "SetState", state ); + // get index in buffer of the Start of the current line we are on + int GetCurrentLineStart(); + // get index in buffer of the end of the current line we are on + int GetCurrentLineEnd(); + bool IsLineBreak(int index); + int GetCursorLine(); + void MoveScrollBar(int delta); + void CalcBreakIndex(); // calculate _recalculateLineBreaksIndex + void CreateEditMenu(); // create copy/cut/paste menu + +public: + Menu *GetEditMenu(); // retrieve copy/cut/paste menu + +private: + void FlipToLastIME(); + +public: + virtual void GetTextRange( wchar_t *buf, int from, int numchars ); // copy a portion of the text to the buffer and add zero-termination + virtual void GetTextRange( char *buf, int from, int numchars ); // copy a portion of the text to the buffer and add zero-termination + +private: + + CUtlVector<wchar_t> m_TextStream; // the text in the text window is stored in this buffer + CUtlVector<wchar_t> m_UndoTextStream; // a copy of the text buffer to revert changes + CUtlVector<int> m_LineBreaks; // an array that holds the index in the buffer to wrap lines at + + int _cursorPos; // the position in the text buffer of the blinking cursor + bool _cursorIsAtEnd; + bool _putCursorAtEnd; + int _undoCursorPos; // a copy of the cursor position to revert changes + bool _cursorBlink; // whether cursor is blinking or not + bool _hideText; // whether text is visible on screen or not + bool _editable; // whether text is editable or not + bool _mouseSelection; // whether we are highlighting text or not (selecting text) + bool _mouseDragSelection; // tells weather mouse is outside window and button is down so we select text + int _mouseSelectCursorStart; // where mouse button was pressed down in text window + long _cursorNextBlinkTime; // time of next cursor blink + int _cursorBlinkRate; // speed of cursor blinking + int _select[2]; // select[1] is the offset in the text to where the cursor is currently + // select[0] is the offset to where the cursor was dragged to. or -1 if no drag. + int _pixelsIndent; + int _charCount; + int _maxCharCount; // max number of chars that can be in the text buffer + HFont _font; // font of chars in the text buffer + HFont _smallfont; + bool _dataChanged; // whether anything in the window has changed. + bool _multiline; // whether buffer is multiline or just a single line + bool _verticalScrollbar; // whether window has a vertical scroll bar + ScrollBar *_vertScrollBar; // the scroll bar used in the window + Color _cursorColor; // color of the text cursor + Color _disabledFgColor; + Color _disabledBgColor; + Color _selectionColor; + Color _selectionTextColor; // color of the highlighted text + Color _defaultSelectionBG2Color; + int _currentStartLine; // use for checking vertical text scrolling (multiline) + int _currentStartIndex; // use for horizontal text scrolling (!multiline) + bool _horizScrollingAllowed; // use to disable horizontal text scrolling period. + Color _focusEdgeColor; + bool _catchEnterKey; + bool _wrap; + bool _sendNewLines; + int _drawWidth; + + // selection data + Menu *m_pEditMenu; ///cut/copy/paste popup + + int _recalculateBreaksIndex; // tells next linebreakindex index to Start recalculating line breaks + bool _selectAllOnFirstFocus : 1; // highlights all text in window when focus is gained. + bool _selectAllOnFocusAlways : 1; + bool _firstFocusStatus; // keep track if we've had that first focus or not + bool m_bAllowNumericInputOnly; + bool m_bAllowNonAsciiCharacters; + bool m_bAutoProgressOnHittingCharLimit; + + enum + { + MAX_COMPOSITION_STRING = 256, + }; + + wchar_t m_szComposition[ MAX_COMPOSITION_STRING ]; + Menu *m_pIMECandidates; + int m_hPreviousIME; + bool m_bDrawLanguageIDAtLeft; + int m_nLangInset; + + bool m_bUseFallbackFont : 1; + HFont m_hFallbackFont; +}; + +} + +#endif // TEXTENTRY_H diff --git a/public/vgui_controls/TextImage.h b/public/vgui_controls/TextImage.h new file mode 100644 index 0000000..20446e7 --- /dev/null +++ b/public/vgui_controls/TextImage.h @@ -0,0 +1,146 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef TEXTIMAGE_H +#define TEXTIMAGE_H + +#ifdef _WIN32 +#pragma once +#endif + +#include <vgui/VGUI.h> +#include <vgui/ILocalize.h> +#include <vgui_controls/Image.h> + +#include <utlvector.h> +#include <UtlSortVector.h> + +class KeyValues; + +namespace vgui +{ + +struct label_colorchange_t +{ + Color color; + int textStreamIndex; +}; + +// Used to sort the color changes into sequential order. +class CColorChangeListLess +{ +public: + bool Less( const label_colorchange_t &src1, const label_colorchange_t &src2, void *pCtx ) + { + if ( src1.textStreamIndex < src2.textStreamIndex ) + return true; + + return false; + } +}; + +//----------------------------------------------------------------------------- +// Purpose: Image that handles drawing of a text string +//----------------------------------------------------------------------------- +class TextImage : public Image +{ +public: + TextImage(const char *text); + TextImage(const wchar_t *wszText); + ~TextImage(); + +public: + // takes the string and looks it up in the localization file to convert it to unicode + virtual void SetText(const char *text); + // sets unicode text directly + virtual void SetText(const wchar_t *text, bool bClearUnlocalizedSymbol = false); + // get the full text in the image + virtual void GetText(char *buffer, int bufferSize); + virtual void GetText(wchar_t *buffer, int bufferLength); + // get the text in it's unlocalized form + virtual void GetUnlocalizedText(char *buffer, int bufferSize); + virtual StringIndex_t GetUnlocalizedTextSymbol(); + + // set the font of the text + virtual void SetFont(vgui::HFont font); + // get the font of the text + virtual vgui::HFont GetFont(); + + // set the width of the text to be drawn + // use this function if the textImage is in another window to cause + // the text to be truncated to the width of the window (elipsis added) + void SetDrawWidth(int width); + // get the width of the text to be drawn + void GetDrawWidth(int &width); + + void ResizeImageToContent(); + void ResizeImageToContentMaxWidth( int nMaxWidth ); + + // set the size of the image + virtual void SetSize(int wide,int tall); + + // get the full size of a text string + virtual void GetContentSize(int &wide, int &tall); + + // draws the text + virtual void Paint(); + + void SetWrap( bool bWrap ); + void RecalculateNewLinePositions(); + + void SetUseFallbackFont( bool bState, HFont hFallback ); + + void SetAllCaps( bool bAllCaps ); + + void SetCenterWrap( bool bWrap ); + void RecalculateCenterWrapIndents(); + + const wchar_t *GetUText( void ) { return _utext; } + + void AddColorChange( Color col, int iTextStreamIndex ); + void SetColorChangeStream( CUtlSortVector<label_colorchange_t,CColorChangeListLess> *pUtlVecStream ); + void ClearColorChangeStream( void ) { m_ColorChangeStream.Purge(); } + + const wchar_t *GetEllipsesPosition( void ) const { return m_pwszEllipsesPosition; } + bool IsWrapping() const { return m_LineBreaks.Count() != 0; } + +protected: + // truncate the _text string to fit into the draw width + void SizeText(wchar_t *tempText, int stringLength); + // gets the size of a specified piece of text + virtual void GetTextSize(int &wide, int &tall); + +private: + void RecalculateEllipsesPosition(); + + wchar_t *_utext; // unicode version of the text + short _textBufferLen; // size of the text buffer + short _textLen; // length of the text string + vgui::HFont _font; // font of the text string + vgui::HFont _fallbackFont; + int _drawWidth; // this is the width of the window we are drawing into. + // if there is not enough room truncate the txt and add an elipsis + + StringIndex_t _unlocalizedTextSymbol; // store off the unlocalized text index for build mode + wchar_t *m_pwszEllipsesPosition; + + bool m_bRecalculateTruncation : 1; + bool m_bWrap : 1; + bool m_bUseFallbackFont : 1; + bool m_bRenderUsingFallbackFont : 1; + bool m_bAllCaps : 1; + CUtlVector<wchar_t *> m_LineBreaks; // an array that holds the index in the buffer to wrap lines at + + bool m_bWrapCenter; // Separate from m_bWrap to ensure it doesn't break legacy code. + CUtlVector<int> m_LineXIndent; // For centered word wrap. The X indent for each line. + + CUtlSortVector<label_colorchange_t,CColorChangeListLess> m_ColorChangeStream; +}; + +} // namespace vgui + +#endif // TEXTIMAGE_H diff --git a/public/vgui_controls/ToggleButton.h b/public/vgui_controls/ToggleButton.h new file mode 100644 index 0000000..355e51a --- /dev/null +++ b/public/vgui_controls/ToggleButton.h @@ -0,0 +1,54 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//===========================================================================// + +#ifndef TOGGLEBUTTON_H +#define TOGGLEBUTTON_H + +#ifdef _WIN32 +#pragma once +#endif + +#include <vgui/VGUI.h> +#include <vgui_controls/Button.h> + +namespace vgui +{ + +//----------------------------------------------------------------------------- +// Purpose: Type of button that when pressed stays selected & depressed until pressed again +//----------------------------------------------------------------------------- +class ToggleButton : public Button +{ + DECLARE_CLASS_SIMPLE( ToggleButton, Button ); + +public: + ToggleButton(Panel *parent, const char *panelName, const char *text); + + virtual void DoClick(); + + /* messages sent (get via AddActionSignalTarget()): + "ButtonToggled" + int "state" + */ + +protected: + // overrides + virtual void OnMouseDoublePressed(MouseCode code); + + virtual Color GetButtonFgColor(); + virtual void ApplySchemeSettings(IScheme *pScheme); + + virtual bool CanBeDefaultButton(void); + virtual void OnKeyCodePressed(KeyCode code); + +private: + Color _selectedColor; +}; + +} // namespace vgui + +#endif // TOGGLEBUTTON_H diff --git a/public/vgui_controls/ToolWindow.h b/public/vgui_controls/ToolWindow.h new file mode 100644 index 0000000..870f533 --- /dev/null +++ b/public/vgui_controls/ToolWindow.h @@ -0,0 +1,78 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//============================================================================= + +#ifndef TOOLWINDOW_H +#define TOOLWINDOW_H +#ifdef _WIN32 +#pragma once +#endif + +#include <vgui/VGUI.h> +#include <vgui_controls/Frame.h> + +namespace vgui +{ + +class ToolWindow; + +// So that an app can have a "custom" tool window class created during window drag/drop operations on the property sheet +class IToolWindowFactory +{ +public: + virtual ToolWindow *InstanceToolWindow( Panel *parent, bool contextLabel, Panel *firstPage, char const *title, bool contextMenu ) = 0; +}; + +//----------------------------------------------------------------------------- +// Purpose: Simple frame that holds a property sheet +//----------------------------------------------------------------------------- +class ToolWindow : public Frame +{ + DECLARE_CLASS_SIMPLE( ToolWindow, Frame ); + +public: + ToolWindow(Panel *parent, bool contextLabel, IToolWindowFactory *factory = 0, Panel *page = NULL, char const *title = NULL, bool contextMenu = false, bool inGlobalList = true ); + + ~ToolWindow(); + + virtual bool IsDraggableTabContainer() const; + + // returns a pointer to the PropertySheet this dialog encapsulates + PropertySheet *GetPropertySheet(); + + // wrapper for PropertySheet interface + void AddPage(Panel *page, const char *title, bool contextMenu ); + void RemovePage( Panel *page ); + Panel *GetActivePage(); + void SetActivePage( Panel *page ); + + void SetToolWindowFactory( IToolWindowFactory *factory ); + IToolWindowFactory *GetToolWindowFactory(); + + static int GetToolWindowCount(); + static ToolWindow *GetToolWindow( int index ); + + static CUtlVector< ToolWindow * > s_ToolWindows; + + virtual void Grow( int edge = 0, int from_x = -1, int from_y = -1 ); + virtual void GrowFromClick(); + +protected: + // vgui overrides + virtual void PerformLayout(); + virtual void ActivateBuildMode(); + virtual void RequestFocus(int direction = 0); + virtual void OnMousePressed(MouseCode code); + virtual void OnMouseDoublePressed(MouseCode code); + +private: + PropertySheet *m_pPropertySheet; + IToolWindowFactory *m_pFactory; +}; + +}; // vgui + + +#endif // TOOLWINDOW_H diff --git a/public/vgui_controls/Tooltip.h b/public/vgui_controls/Tooltip.h new file mode 100644 index 0000000..2c7ec98 --- /dev/null +++ b/public/vgui_controls/Tooltip.h @@ -0,0 +1,76 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: Creates a Message box with a question in it and yes/no buttons +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef TOOLTIP_H +#define TOOLTIP_H + +#ifdef _WIN32 +#pragma once +#endif + +#include <vgui/VGUI.h> +#include <vgui_controls/Controls.h> +#include <utlvector.h> + +namespace vgui +{ + +//----------------------------------------------------------------------------- +// Purpose: Tooltip for a panel - shows text when cursor hovers over a panel +//----------------------------------------------------------------------------- +class BaseTooltip +{ +public: + BaseTooltip(Panel *parent, const char *text = NULL); + + virtual void SetText(const char *text); + virtual const char *GetText(); + + virtual void ShowTooltip(Panel *currentPanel); + virtual void HideTooltip(); + + bool ShouldLayout( void ); + virtual void PerformLayout() { return; } + virtual void PositionWindow( Panel *pTipPanel ); + + void ResetDelay(); + void SetTooltipFormatToSingleLine(); + void SetTooltipFormatToMultiLine(); + void SetTooltipDelay(int tooltipDelayMilliseconds); + int GetTooltipDelay(); + void SetEnabled( bool bState ); + +private: + Panel *m_pParent; + virtual void ApplySchemeSettings(IScheme *pScheme) {}; +protected: + CUtlVector<char> m_Text; + int _delay; // delay that counts down + int _tooltipDelay; // delay before tooltip comes up. + bool _makeVisible : 1; + bool _displayOnOneLine : 1; + bool _isDirty : 1; + bool _enabled : 1; +}; + +class TextTooltip : public BaseTooltip +{ +public: + TextTooltip(Panel *parent, const char *text = NULL); + ~TextTooltip(); + + virtual void SetText(const char *text); + virtual void ShowTooltip(Panel *currentPanel); + virtual void HideTooltip(); + virtual void SizeTextWindow(); + virtual void PerformLayout(); + virtual void ApplySchemeSettings(IScheme *pScheme); +}; + +}; + +#endif // TOOLTIP_H diff --git a/public/vgui_controls/TreeView.h b/public/vgui_controls/TreeView.h new file mode 100644 index 0000000..521d169 --- /dev/null +++ b/public/vgui_controls/TreeView.h @@ -0,0 +1,203 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef TREEVIEW_H +#define TREEVIEW_H + +#ifdef _WIN32 +#pragma once +#endif + +#include <utllinkedlist.h> +#include <utlvector.h> +#include <vgui/VGUI.h> +#include <vgui_controls/Panel.h> + +class KeyValues; + +namespace vgui +{ + +class ExpandButton; +class TreeNode; +class TreeViewSubPanel; + +// sorting function, should return true if node1 should be displayed before node2 +typedef bool (*TreeViewSortFunc_t)(KeyValues *node1, KeyValues *node2); + +class TreeView : public Panel +{ + DECLARE_CLASS_SIMPLE( TreeView, Panel ); + +public: + TreeView(Panel *parent, const char *panelName); + ~TreeView(); + + void SetSortFunc(TreeViewSortFunc_t pSortFunc); + + virtual int AddItem(KeyValues *data, int parentItemIndex); + + virtual int GetRootItemIndex(); + virtual int GetNumChildren( int itemIndex ); + virtual int GetChild( int iParentItemIndex, int iChild ); // between 0 and GetNumChildren( iParentItemIndex ). + + virtual int GetItemCount(void); + virtual KeyValues *GetItemData(int itemIndex); + virtual void RemoveItem(int itemIndex, bool bPromoteChildren, bool bRecursivelyRemove = false ); + virtual void RemoveAll(); + virtual bool ModifyItem(int itemIndex, KeyValues *data); + virtual int GetItemParent(int itemIndex); + + virtual void SetFont(HFont font); + + virtual void SetImageList(ImageList *imageList, bool deleteImageListWhenDone); + + void SetAllowMultipleSelections( bool state ); + bool IsMultipleSelectionAllowed() const; + + virtual void ClearSelection(); + virtual void AddSelectedItem( int itemIndex, bool clearCurrentSelection, bool requestFocus = true, bool bMakeItemVisible = true ); + virtual void RemoveSelectedItem( int itemIndex ); + virtual void SelectAll(); + + virtual bool IsItemSelected( int itemIndex ); + virtual void RangeSelectItems( int clickedItem ); + virtual void FindNodesInRange( int startItem, int endItem, CUtlVector< int >& itemIndices ); + + // returns the id of the currently selected item, -1 if nothing is selected + virtual int GetSelectedItemCount() const; + virtual int GetFirstSelectedItem() const; + virtual void GetSelectedItems( CUtlVector< int >& list ); + virtual void GetSelectedItemData( CUtlVector< KeyValues * >& list ); + + // set colors for individual elments + virtual void SetItemFgColor(int itemIndex, const Color& color); + virtual void SetItemBgColor(int itemIndex, const Color& color); + virtual void SetItemSelectionTextColor( int itemIndex, const Color& clr ); + virtual void SetItemSelectionBgColor( int itemIndex, const Color& clr ); + virtual void SetItemSelectionUnfocusedBgColor( int itemIndex, const Color& clr ); + + // returns true if the itemID is valid for use + virtual bool IsItemIDValid(int itemIndex); + + // item iterators + // iterate from [0..GetHighestItemID()], + // and check each with IsItemIDValid() before using + virtual int GetHighestItemID(); + + virtual void ExpandItem(int itemIndex, bool bExpand); + virtual bool IsItemExpanded( int itemIndex ); + + virtual void MakeItemVisible(int itemIndex); + + // This tells which of the visible items is the top one. + virtual void GetVBarInfo( int &top, int &nItemsVisible, bool& hbarVisible ); + + virtual HFont GetFont(); + + virtual void GenerateDragDataForItem( int itemIndex, KeyValues *msg ); + virtual void SetDragEnabledItems( bool state ); + + virtual void OnLabelChanged( int itemIndex, char const *oldString, char const *newString ); + virtual bool IsLabelEditingAllowed() const; + virtual bool IsLabelBeingEdited() const; + virtual void SetAllowLabelEditing( bool state ); + + /* message sent + + "TreeViewItemSelected" int "itemIndex" + called when the selected item changes + "TreeViewItemDeselected" int "itemIndex" + called when item is deselected + */ + int GetRowHeight(); + int GetVisibleMaxWidth(); + virtual void OnMousePressed(MouseCode code); + + // By default, the tree view expands nodes on left-click. This enables/disables that feature + void EnableExpandTreeOnLeftClick( bool bEnable ); + + virtual void SetLabelEditingAllowed( int itemIndex, bool state ); + virtual void StartEditingLabel( int itemIndex ); + + virtual bool IsItemDroppable( int itemIndex, CUtlVector< KeyValues * >& msglist ); + virtual void OnItemDropped( int itemIndex, CUtlVector< KeyValues * >& msglist ); + virtual bool GetItemDropContextMenu( int itemIndex, Menu *menu, CUtlVector< KeyValues * >& msglist ); + virtual HCursor GetItemDropCursor( int itemIndex, CUtlVector< KeyValues * >& msglist ); + + virtual int GetPrevChildItemIndex( int itemIndex ); + virtual int GetNextChildItemIndex( int itemIndex ); + + virtual void PerformLayout(); + + // Makes the scrollbar parented to some other panel... + ScrollBar *SetScrollBarExternal( bool vertical, Panel *newParent ); + void GetScrollBarSize( bool vertical, int& w, int& h ); + + void SetMultipleItemDragEnabled( bool state ); // if this is set, then clicking on one row and dragging will select a run or items, etc. + bool IsMultipleItemDragEnabled() const; + + int FindItemUnderMouse( int mx, int my ); + +protected: + // functions to override + // called when a node, marked as "Expand", needs to generate it's child nodes when expanded + virtual void GenerateChildrenOfNode(int itemIndex) {} + + // override to open a custom context menu on a node being selected and right-clicked + virtual void GenerateContextMenu( int itemIndex, int x, int y ) {} + + // overrides + virtual void OnMouseWheeled(int delta); + virtual void OnSizeChanged(int wide, int tall); + virtual void ApplySchemeSettings(IScheme *pScheme); + MESSAGE_FUNC_INT( OnSliderMoved, "ScrollBarSliderMoved", position ); + virtual void SetBgColor( Color color ); + +private: + friend class TreeNode; + friend class TreeNodeText; + + TreeNode* GetItem( int itemIndex ); + virtual void RemoveChildrenOfNode( int itemIndex ); + void SetLabelBeingEdited( bool state ); + + // Clean up the image list + void CleanUpImageList( ); + + // to be accessed by TreeNodes + IImage* GetImage(int index); + + // bools + bool m_bAllowLabelEditing : 1; + bool m_bDragEnabledItems : 1; + bool m_bDeleteImageListWhenDone : 1; + bool m_bLeftClickExpandsTree : 1; + bool m_bLabelBeingEdited : 1; + bool m_bMultipleItemDragging : 1; + bool m_bAllowMultipleSelections : 1; + + // cross reference - no hierarchy ordering in this list + CUtlLinkedList<TreeNode *, int> m_NodeList; + ScrollBar *m_pHorzScrollBar, *m_pVertScrollBar; + int m_nRowHeight; + + ImageList *m_pImageList; + TreeNode *m_pRootNode; + TreeViewSortFunc_t m_pSortFunc; + HFont m_Font; + + CUtlVector< TreeNode * > m_SelectedItems; + TreeViewSubPanel *m_pSubPanel; + + int m_nMostRecentlySelectedItem; + bool m_bScrollbarExternal[ 2 ]; // 0 = vert, 1 = horz +}; + +} + +#endif // TREEVIEW_H diff --git a/public/vgui_controls/TreeViewListControl.h b/public/vgui_controls/TreeViewListControl.h new file mode 100644 index 0000000..8a03470 --- /dev/null +++ b/public/vgui_controls/TreeViewListControl.h @@ -0,0 +1,130 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//=============================================================================// + +#ifndef TREEVIEWLISTCONTROL_H +#define TREEVIEWLISTCONTROL_H +#ifdef _WIN32 +#pragma once +#endif + + +#include <utllinkedlist.h> +#include <utlvector.h> +#include <vgui/VGUI.h> +#include <vgui_controls/Panel.h> +#include "utlsymbol.h" + + +namespace vgui +{ + +// --------------------------------------------------------------------------------- // +// CTreeViewListControl +// +// This control has N columns, with a tree view in the leftmost column. +// --------------------------------------------------------------------------------- // + +class CTreeViewListControl : public vgui::Panel +{ + DECLARE_CLASS_SIMPLE( CTreeViewListControl, Panel ); + +public: + + CTreeViewListControl( vgui::Panel *pParent, const char *pName ); + + // Set the tree view to be displayed on the left. If this isn't set, then nothing displays in here. + virtual void SetTreeView( vgui::TreeView *pTree ); + + // Set the height of the title bar. + virtual void SetTitleBarInfo( vgui::HFont hFont, int titleBarHeight ); + + // Set the color to draw the border lines in. + virtual void SetBorderColor( Color clr ); + + // Initialize the column headers.. This info includes the tree view on the left, so this + virtual void SetNumColumns( int nColumns ); + virtual int GetNumColumns() const; + // ciFlags is a combination of CI_ flags. + virtual void SetColumnInfo( int iColumn, const char *pTitle, int width, int ciFlags=0 ); + + // Use this to render your stuff. Iterate over the rows in the tree view and + virtual int GetNumRows(); + virtual int GetTreeItemAtRow( int iRow ); // You can use m_pTree->GetItemData to get at the data for the row. + + // Use this to find out the client area to render in for each grid element. + // The returned box is inclusive. + // The rule is that the the top and left pixels in each grid element are reserved for lines. + virtual void GetGridElementBounds( int iColumn, int iRow, int &left, int &top, int &right, int &bottom ); + + virtual vgui::TreeView *GetTree(); + + virtual int GetTitleBarHeight(); + + virtual int GetScrollBarSize(); + +// Overrides. +public: + + // This is where it recalculates the row infos. + virtual void PerformLayout(); + + // Usually, you'll want to override paint. After calling the base, use GetNumRows() to + // iterate over the data in the tree control and fill in the other columns. + virtual void Paint(); + virtual void PostChildPaint(); + + // You can override this to change the way the title bars are drawn. + virtual void DrawTitleBars(); + + +public: + + enum + { + // By default, column header text is centered. + CI_HEADER_LEFTALIGN =0x0001 + }; + + +protected: + + void RecalculateRows(); + void RecalculateRows_R( int index ); + void RecalculateColumns(); + +private: + + vgui::TreeView *m_pTree; + + class CColumnInfo + { + public: + CColumnInfo() + { + m_Width = m_Left = m_Right = m_ciFlags = 0; + } + + CUtlSymbol m_Title; + int m_Width; + int m_Left; + int m_Right; + int m_ciFlags; // Combination of CI_ flags. + }; + CUtlVector<CColumnInfo> m_Columns; + + vgui::HFont m_TitleBarFont; + int m_TitleBarHeight; + + // These are indices into the tree view. + CUtlVector<int> m_Rows; + + Color m_BorderColor; +}; + +} // namespace + + +#endif // TREEVIEWLISTCONTROL_H diff --git a/public/vgui_controls/URLLabel.h b/public/vgui_controls/URLLabel.h new file mode 100644 index 0000000..6611251 --- /dev/null +++ b/public/vgui_controls/URLLabel.h @@ -0,0 +1,49 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef URLLABEL_H +#define URLLABEL_H + +#ifdef _WIN32 +#pragma once +#endif + +#include <vgui/VGUI.h> +#include <vgui_controls/Label.h> + +namespace vgui +{ + +class URLLabel : public Label +{ + DECLARE_CLASS_SIMPLE( URLLabel, Label ); + +public: + URLLabel(Panel *parent, const char *panelName, const char *text, const char *pszURL); + URLLabel(Panel *parent, const char *panelName, const wchar_t *wszText, const char *pszURL); + ~URLLabel(); + + void SetURL(const char *pszURL); + +protected: + virtual void OnMousePressed(MouseCode code); + virtual void ApplySettings( KeyValues *inResourceData ); + virtual void GetSettings( KeyValues *outResourceData ); + virtual void ApplySchemeSettings(IScheme *pScheme); + virtual const char *GetDescription( void ); + + const char *GetURL( void ) { return m_pszURL; } + +private: + char *m_pszURL; + int m_iURLSize; + bool m_bUnderline; +}; + +} + +#endif // URLLABEL_H diff --git a/public/vgui_controls/WizardPanel.h b/public/vgui_controls/WizardPanel.h new file mode 100644 index 0000000..c6e014e --- /dev/null +++ b/public/vgui_controls/WizardPanel.h @@ -0,0 +1,127 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef WIZARDPANEL_H +#define WIZARDPANEL_H + +#ifdef _WIN32 +#pragma once +#endif + +#include <vgui_controls/Frame.h> + +namespace vgui +{ + +class WizardSubPanel; + +//----------------------------------------------------------------------------- +// Purpose: Type of dialog that supports moving back and forth through a series +// of sub-dialogs, WizardSubPanels +//----------------------------------------------------------------------------- +class WizardPanel : public Frame +{ + DECLARE_CLASS_SIMPLE( WizardPanel, Frame ); + +public: + WizardPanel(Panel *parent, const char *panelName); + ~WizardPanel(); + + // Start the wizard, starting with the startPanel + virtual void Run(WizardSubPanel *startPanel); + + // Called when the buttons are pressed + // WizardSubPanels can also call these functions to simulate a button being pressed + MESSAGE_FUNC( OnNextButton, "NextButton" ); + MESSAGE_FUNC( OnPrevButton, "PrevButton" ); + MESSAGE_FUNC( OnFinishButton, "FinishButton" ); + MESSAGE_FUNC( OnCancelButton, "CancelButton" ); + + // sets whether or not a button is enabled + // this state is managed, and will be reset whenever going to a new page + virtual void SetNextButtonEnabled(bool state); + virtual void SetPrevButtonEnabled(bool state); + virtual void SetFinishButtonEnabled(bool state); + virtual void SetCancelButtonEnabled(bool state); + + // sets whether or not a button is visible + // this state is unmanaged, the user needs to ensure that the buttons state + // is correct when going both back and prev through the wizard + virtual void SetNextButtonVisible(bool state); + virtual void SetPrevButtonVisible(bool state); + virtual void SetFinishButtonVisible(bool state); + virtual void SetCancelButtonVisible(bool state); + + // sets the text for a button + // setting the text to be NULL resets the text to it's default state + // this state is unmanaged, the user needs to ensure that the buttons state + // is correct when going both back and prev through the wizard + virtual void SetNextButtonText(const char *text); + virtual void SetPrevButtonText(const char *text); + virtual void SetFinishButtonText(const char *text); + virtual void SetCancelButtonText(const char *text); + + // general wizard state for all the subpanels to access + virtual KeyValues *GetWizardData(); + + // recalculates where the key focus should be in the wizard + virtual void ResetKeyFocus(); + virtual void ResetDefaultButton(); + + // resets the sub panel history for the control + virtual void ResetHistory(); + + // returns a page by name + virtual WizardSubPanel *GetSubPanelByName(const char *pageName); + + virtual void ShowButtons(bool state); + virtual void GetClientArea(int &x, int &y, int &wide, int &tall); + +protected: + MESSAGE_FUNC_PTR( InternalActivateNextSubPanel, "ActivateNextSubPanel", panel ) + { + ActivateNextSubPanel( (WizardSubPanel *)panel ); + } + + virtual void ActivateNextSubPanel(WizardSubPanel *subPanel); + virtual void ActivatePrevSubPanel(); + virtual void CreateButtons(); + virtual void RecalculateTabOrdering(); + virtual vgui::WizardSubPanel *GetCurrentSubPanel() { return _currentSubPanel; } + + // overrides + virtual void PerformLayout(); + virtual void ApplySchemeSettings(IScheme *pScheme); + + // reroute build messages to the currently active sub panel + virtual void ActivateBuildMode(); + + // close maps to the cancel button + virtual void OnClose(); + virtual void OnCommand(const char *command); + virtual void OnCloseFrameButtonPressed(); + +private: + WizardSubPanel *FindNextValidSubPanel(WizardSubPanel *currentPanel); + + Button *_prevButton; + Button *_nextButton; + Button *_cancelButton; + Button *_finishButton; + + WizardSubPanel *_currentSubPanel; + KeyValues *_currentData; + + Dar<WizardSubPanel *> _subPanelStack; // contains a list of all the subpanels (not including the current one) + + bool _showButtons; +}; + +} // namespace vgui + + +#endif // WIZARDPANEL_H diff --git a/public/vgui_controls/WizardSubPanel.h b/public/vgui_controls/WizardSubPanel.h new file mode 100644 index 0000000..a7d71fb --- /dev/null +++ b/public/vgui_controls/WizardSubPanel.h @@ -0,0 +1,91 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef WIZARDSUBPANEL_H +#define WIZARDSUBPANEL_H + +#ifdef _WIN32 +#pragma once +#endif + +#include <vgui_controls/EditablePanel.h> + +namespace vgui +{ + +//----------------------------------------------------------------------------- +// Purpose: Base panel for use in Wizards and in property sheets +//----------------------------------------------------------------------------- +class WizardSubPanel : public EditablePanel +{ + DECLARE_CLASS_SIMPLE( WizardSubPanel, EditablePanel ); + +public: + // constructor + WizardSubPanel(Panel *parent, const char *panelName); + ~WizardSubPanel(); + + // called when the subpanel is displayed + // All controls & data should be reinitialized at this time + virtual void OnDisplayAsNext() {} + + // called anytime the panel is first displayed, whether the user is moving forward or back + // called immediately after OnDisplayAsNext/OnDisplayAsPrev + virtual void OnDisplay() {} + + // called when displayed as previous + virtual void OnDisplayAsPrev() {} + + // called when one of the wizard buttons are pressed + // returns true if the wizard should advance, false otherwise + virtual bool OnNextButton() { return true; } + virtual bool OnPrevButton() { return true; } + virtual bool OnFinishButton() { return true; } + virtual bool OnCancelButton() { return true; } + + // returns true if this panel should be displayed, or if we should just skip over it + virtual bool ShouldDisplayPanel() { return true; } + + // return true if this subpanel doesn't need the next/prev/finish/cancel buttons or will do it itself + virtual bool isNonWizardPanel() { return false; } + + // returns a pointer to the next subpanel that should be displayed + virtual WizardSubPanel *GetNextSubPanel() = 0; + + // returns a pointer to the panel to return to + // it must be a panel that is already in the wizards panel history + // returning NULL tells it to use the immediate previous panel in the history + virtual WizardSubPanel *GetPrevSubPanel() { return NULL; } + + virtual WizardPanel *GetWizardPanel() { return _wizardPanel; } + virtual void SetWizardPanel(WizardPanel *wizardPanel) { _wizardPanel = wizardPanel; } + + // returns a pointer to the wizard's doc + virtual KeyValues *GetWizardData(); + + // returns a pointer + virtual WizardSubPanel *GetSiblingSubPanelByName(const char *pageName); + + // gets the size this subpanel would like the wizard to be + // returns true if it has a desired size + virtual bool GetDesiredSize(int &wide, int &tall); + +protected: + virtual void ApplySettings(KeyValues *inResourceData); + virtual void GetSettings( KeyValues *outResourceData ); + virtual void ApplySchemeSettings(IScheme *pScheme); + virtual const char *GetDescription(); + +private: + WizardPanel *_wizardPanel; + int m_iDesiredWide, m_iDesiredTall; +}; + +} // namespace vgui + + +#endif // WIZARDSUBPANEL_H diff --git a/public/vgui_controls/consoledialog.h b/public/vgui_controls/consoledialog.h new file mode 100644 index 0000000..1a354a0 --- /dev/null +++ b/public/vgui_controls/consoledialog.h @@ -0,0 +1,171 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//===========================================================================// + +#ifndef CONSOLEDIALOG_H +#define CONSOLEDIALOG_H +#ifdef _WIN32 +#pragma once +#endif + +#include <Color.h> +#include "tier1/utlvector.h" +#include "vgui_controls/EditablePanel.h" +#include "vgui_controls/Frame.h" +#include "icvar.h" + +class ConCommandBase; + + +namespace vgui +{ + +// Things the user typed in and hit submit/return with +class CHistoryItem +{ +public: + CHistoryItem( void ); + CHistoryItem( const char *text, const char *extra = NULL ); + CHistoryItem( const CHistoryItem& src ); + ~CHistoryItem( void ); + + const char *GetText() const; + const char *GetExtra() const; + void SetText( const char *text, const char *extra ); + bool HasExtra() { return m_bHasExtra; } + +private: + char *m_text; + char *m_extraText; + bool m_bHasExtra; +}; + +//----------------------------------------------------------------------------- +// Purpose: Game/dev console dialog +//----------------------------------------------------------------------------- +class CConsolePanel : public vgui::EditablePanel, public IConsoleDisplayFunc +{ + DECLARE_CLASS_SIMPLE( CConsolePanel, vgui::EditablePanel ); + +public: + CConsolePanel( Panel *pParent, const char *pName, bool bStatusVersion ); + ~CConsolePanel(); + + // Inherited from IConsoleDisplayFunc + virtual void ColorPrint( const Color& clr, const char *pMessage ); + virtual void Print( const char *pMessage ); + virtual void DPrint( const char *pMessage ); + virtual void GetConsoleText( char *pchText, size_t bufSize ) const; + + // clears the console + void Clear(); + + // writes console to a file + void DumpConsoleTextToFile(); + + // Hides the console + void Hide(); + + bool TextEntryHasFocus() const; + void TextEntryRequestFocus(); + + + +private: + enum + { + MAX_HISTORY_ITEMS = 100, + }; + + class CompletionItem + { + public: + CompletionItem( void ); + CompletionItem( const CompletionItem& src ); + CompletionItem& operator =( const CompletionItem& src ); + ~CompletionItem( void ); + const char *GetItemText( void ); + const char *GetCommand( void ) const; + const char *GetName() const; + + bool m_bIsCommand; + ConCommandBase *m_pCommand; + CHistoryItem *m_pText; + }; + +protected: + // methods + void OnAutoComplete(bool reverse); + MESSAGE_FUNC_PTR( OnTextChanged, "TextChanged", panel ); + void RebuildCompletionList(const char *partialText); + void UpdateCompletionListPosition(); + MESSAGE_FUNC( CloseCompletionList, "CloseCompletionList" ); + MESSAGE_FUNC_CHARPTR( OnMenuItemSelected, "CompletionCommand", command ); + void ClearCompletionList(); + void AddToHistory( const char *commandText, const char *extraText ); + + // vgui overrides + virtual void PerformLayout(); + virtual void ApplySchemeSettings(vgui::IScheme *pScheme); + virtual void OnCommand(const char *command); + virtual void OnKeyCodeTyped(vgui::KeyCode code); + virtual void OnThink(); + + vgui::RichText *m_pHistory; + vgui::TextEntry *m_pEntry; + vgui::Button *m_pSubmit; + vgui::Menu *m_pCompletionList; + Color m_PrintColor; + Color m_DPrintColor; + + int m_iNextCompletion; // the completion that we'll next go to + char m_szPartialText[256]; + char m_szPreviousPartialText[256]; + bool m_bAutoCompleteMode; // true if the user is currently tabbing through completion options + bool m_bWasBackspacing; + bool m_bStatusVersion; + + CUtlVector< CompletionItem * > m_CompletionList; + CUtlVector< CHistoryItem > m_CommandHistory; + + friend class CConsoleDialog; +}; + + +class CConsoleDialog : public vgui::Frame +{ + DECLARE_CLASS_SIMPLE( CConsoleDialog, vgui::Frame ); + +public: + CConsoleDialog( vgui::Panel *pParent, const char *pName, bool bStatusVersion ); + + virtual void OnScreenSizeChanged( int iOldWide, int iOldTall ); + virtual void Close(); + virtual void PerformLayout(); + + // brings dialog to the fore + MESSAGE_FUNC( Activate, "Activate" ); + MESSAGE_FUNC_CHARPTR( OnCommandSubmitted, "CommandSubmitted", command ); + + // hides the console + void Hide(); + + // Chain to the page + void Print( const char *msg ); + void DPrint( const char *msg ); + void ColorPrint( const Color& clr, const char *msg ); + void Clear(); + void DumpConsoleTextToFile(); + + virtual void OnKeyCodePressed( vgui::KeyCode code ); + +protected: + CConsolePanel *m_pConsolePanel; +}; + +} // end namespace vgui + +#endif // CONSOLEDIALOG_H diff --git a/public/vgui_controls/cvartogglecheckbutton.h b/public/vgui_controls/cvartogglecheckbutton.h new file mode 100644 index 0000000..5d9a9ba --- /dev/null +++ b/public/vgui_controls/cvartogglecheckbutton.h @@ -0,0 +1,191 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef CVARTOGGLECHECKBUTTON_H +#define CVARTOGGLECHECKBUTTON_H +#ifdef _WIN32 +#pragma once +#endif + +#include "vgui/VGUI.h" +#include "vgui_controls/CheckButton.h" +#include "tier1/utlstring.h" +#include "tier1/KeyValues.h" +namespace vgui +{ + +template< class T > +class CvarToggleCheckButton : public CheckButton +{ + DECLARE_CLASS_SIMPLE( CvarToggleCheckButton, CheckButton ); + +public: + CvarToggleCheckButton( Panel *parent, const char *panelName, const char *text = "", + char const *cvarname = NULL, bool ignoreMissingCvar = false ); + ~CvarToggleCheckButton(); + + virtual void SetSelected( bool state ); + + virtual void Paint(); + + void Reset(); + void ApplyChanges(); + bool HasBeenModified(); + virtual void ApplySettings( KeyValues *inResourceData ); + +private: + // Called when the OK / Apply button is pressed. Changed data should be written into cvar. + MESSAGE_FUNC( OnApplyChanges, "ApplyChanges" ); + MESSAGE_FUNC( OnButtonChecked, "CheckButtonChecked" ); + + T m_cvar; + bool m_bStartValue; + bool m_bIgnoreMissingCvar; +}; + +//----------------------------------------------------------------------------- +// Purpose: Constructor +//----------------------------------------------------------------------------- +template< class T > +CvarToggleCheckButton<T>::CvarToggleCheckButton( Panel *parent, const char *panelName, const char *text, char const *cvarname, bool ignoreMissingCvar ) + : CheckButton( parent, panelName, text ), m_cvar( (cvarname)?cvarname:"", (cvarname)?ignoreMissingCvar:true ) +{ + m_bIgnoreMissingCvar = ignoreMissingCvar; + + if (m_cvar.IsValid()) + { + Reset(); + } + AddActionSignalTarget( this ); +} + +//----------------------------------------------------------------------------- +// Purpose: Destructor +//----------------------------------------------------------------------------- +template< class T > +CvarToggleCheckButton<T>::~CvarToggleCheckButton() +{ +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +template< class T > +void CvarToggleCheckButton<T>::Paint() +{ + if ( !m_cvar.IsValid() ) + { + BaseClass::Paint(); + return; + } + + bool value = m_cvar.GetBool(); + + if ( value != m_bStartValue ) + { + SetSelected( value ); + m_bStartValue = value; + } + BaseClass::Paint(); +} + +//----------------------------------------------------------------------------- +// Purpose: Called when the OK / Apply button is pressed. Changed data should be written into cvar. +//----------------------------------------------------------------------------- +template< class T > +void CvarToggleCheckButton<T>::OnApplyChanges() +{ + ApplyChanges(); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +template< class T > +void CvarToggleCheckButton<T>::ApplyChanges() +{ + if ( !m_cvar.IsValid() ) + return; + + m_bStartValue = IsSelected(); + m_cvar.SetValue( m_bStartValue ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +template< class T > +void CvarToggleCheckButton<T>::Reset() +{ + if ( !m_cvar.IsValid() ) + return; + + m_bStartValue = m_cvar.GetBool(); + SetSelected(m_bStartValue); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +template< class T > +bool CvarToggleCheckButton<T>::HasBeenModified() +{ + return IsSelected() != m_bStartValue; +} + +//----------------------------------------------------------------------------- +// Purpose: +// Input : *panel - +//----------------------------------------------------------------------------- +template< class T > +void CvarToggleCheckButton<T>::SetSelected( bool state ) +{ + BaseClass::SetSelected( state ); +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +template< class T > +void CvarToggleCheckButton<T>::OnButtonChecked() +{ + if (HasBeenModified()) + { + PostActionSignal(new KeyValues("ControlModified")); + } +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +template< class T > +void CvarToggleCheckButton<T>::ApplySettings( KeyValues *inResourceData ) +{ + BaseClass::ApplySettings( inResourceData ); + + const char *cvarName = inResourceData->GetString("cvar_name", ""); + const char *cvarValue = inResourceData->GetString("cvar_value", ""); + + if( Q_stricmp( cvarName, "") == 0 ) + return;// Doesn't have cvar set up in res file, must have been constructed with it. + + if( Q_stricmp( cvarValue, "1") == 0 ) + m_bStartValue = true; + else + m_bStartValue = false; + + m_cvar.Init( cvarName, m_bIgnoreMissingCvar ); + if ( m_cvar.IsValid() ) + { + SetSelected( m_cvar.GetBool() ); + } +} + +} // namespace vgui + +#endif // CVARTOGGLECHECKBUTTON_H diff --git a/public/vgui_controls/pch_vgui_controls.h b/public/vgui_controls/pch_vgui_controls.h new file mode 100644 index 0000000..7b09eb5 --- /dev/null +++ b/public/vgui_controls/pch_vgui_controls.h @@ -0,0 +1,115 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef PCH_VGUI_CONTROLS_H +#define PCH_VGUI_CONTROLS_H + +#ifdef _WIN32 +#pragma once +#endif + +// general includes +#include <ctype.h> +#include <stdlib.h> +#include "tier0/dbg.h" +#include "tier0/valve_off.h" +#include "tier1/KeyValues.h" + +#include "tier0/valve_on.h" +#include "tier0/memdbgon.h" + +#include "filesystem.h" +#include "tier0/validator.h" + +// vgui includes +#include "vgui/IBorder.h" +#include "vgui/IInput.h" +#include "vgui/ILocalize.h" +#include "vgui/IPanel.h" +#include "vgui/IScheme.h" +#include "vgui/ISurface.h" +#include "vgui/ISystem.h" +#include "vgui/IVGui.h" +#include "vgui/KeyCode.h" +#include "vgui/Cursor.h" +#include "vgui/MouseCode.h" + +// vgui controls includes +#include "vgui_controls/Controls.h" + +#include "vgui_controls/AnimatingImagePanel.h" +#include "vgui_controls/AnimationController.h" +#include "vgui_controls/BitmapImagePanel.h" +#include "vgui_controls/BuildGroup.h" +#include "vgui_controls/BuildModeDialog.h" +#include "vgui_controls/Button.h" +#include "vgui_controls/CheckButton.h" +#include "vgui_controls/CheckButtonList.h" +#include "vgui_controls/ComboBox.h" +#include "vgui_controls/Controls.h" +#include "vgui_controls/DialogManager.h" +#include "vgui_controls/DirectorySelectDialog.h" +#include "vgui_controls/Divider.h" +#include "vgui_controls/EditablePanel.h" +#include "vgui_controls/FileOpenDialog.h" +#include "vgui_controls/FocusNavGroup.h" +#include "vgui_controls/Frame.h" +#include "vgui_controls/GraphPanel.h" +#include "vgui_controls/HTML.h" +#include "vgui_controls/Image.h" +#include "vgui_controls/ImageList.h" +#include "vgui_controls/ImagePanel.h" +#include "vgui_controls/Label.h" +#include "vgui_controls/ListPanel.h" +#include "vgui_controls/ListViewPanel.h" +#include "vgui_controls/Menu.h" +#include "vgui_controls/MenuBar.h" +#include "vgui_controls/MenuButton.h" +#include "vgui_controls/MenuItem.h" +#include "vgui_controls/MessageBox.h" +#include "vgui_controls/Panel.h" +#ifndef HL1 +#include "vgui_controls/PanelAnimationVar.h" +#endif +#include "vgui_controls/PanelListPanel.h" +#include "vgui_controls/PHandle.h" +#include "vgui_controls/ProgressBar.h" +#include "vgui_controls/ProgressBox.h" +#include "vgui_controls/PropertyDialog.h" +#include "vgui_controls/PropertyPage.h" +#include "vgui_controls/PropertySheet.h" +#include "vgui_controls/QueryBox.h" +#include "vgui_controls/RadioButton.h" +#include "vgui_controls/RichText.h" +#include "vgui_controls/ScrollBar.h" +#include "vgui_controls/ScrollBarSlider.h" +#include "vgui_controls/SectionedListPanel.h" +#include "vgui_controls/Slider.h" +#ifndef HL1 +#include "vgui_controls/Splitter.h" +#endif +#include "vgui_controls/TextEntry.h" +#include "vgui_controls/TextImage.h" +#include "vgui_controls/ToggleButton.h" +#include "vgui_controls/Tooltip.h" +#ifndef HL1 +#include "vgui_controls/ToolWindow.h" +#endif +#include "vgui_controls/TreeView.h" +#ifndef HL1 +#include "vgui_controls/TreeViewListControl.h" +#endif +#include "vgui_controls/URLLabel.h" +#include "vgui_controls/WizardPanel.h" +#include "vgui_controls/WizardSubPanel.h" + +#ifndef HL1 +#include "vgui_controls/KeyBoardEditorDialog.h" +#include "vgui_controls/InputDialog.h" +#endif + +#endif // PCH_VGUI_CONTROLS_H
\ No newline at end of file diff --git a/public/vgui_controls/perforcefilelistframe.h b/public/vgui_controls/perforcefilelistframe.h new file mode 100644 index 0000000..7744bf2 --- /dev/null +++ b/public/vgui_controls/perforcefilelistframe.h @@ -0,0 +1,151 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// List of perforce files and operations +// +//============================================================================= + +#ifndef PERFORCEFILELISTFRAME_H +#define PERFORCEFILELISTFRAME_H + +#ifdef _WIN32 +#pragma once +#endif + +#include "vgui_controls/Frame.h" +#include "tier1/utlvector.h" +#include "tier1/utlstring.h" +#include "p4lib/ip4.h" + + +//----------------------------------------------------------------------------- +// Forward declarations +//----------------------------------------------------------------------------- + + +//----------------------------------------------------------------------------- +// Enumeration of operation dialog ids +//----------------------------------------------------------------------------- +enum +{ + OPERATION_DIALOG_ID_PERFORCE = 0, + + OPERATION_DIALOG_STANDARD_ID_COUNT, + OPERATION_DIALOG_STANDARD_ID_MAX = OPERATION_DIALOG_STANDARD_ID_COUNT - 1, +}; + + +//----------------------------------------------------------------------------- +// Purpose: Modal dialog for a list of files + an operation to perform +//----------------------------------------------------------------------------- +class COperationFileListFrame : public vgui::Frame +{ + DECLARE_CLASS_SIMPLE( COperationFileListFrame, vgui::Frame ); + +public: + // NOTE: The dialog ID is used to allow dialogs to have different configurations saved + COperationFileListFrame( vgui::Panel *pParent, const char *pTitle, const char *pColumnHeader, bool bShowDescription, bool bShowOkOnly = false, int nDialogID = 1 ); + virtual ~COperationFileListFrame(); + + // Command handler + virtual void OnCommand( const char *pCommand ); + virtual void PerformLayout(); + + // Adds files to the frame + void ClearAllOperations(); + void AddOperation( const char *pOperation, const char *pFileName ); + void AddOperation( const char *pOperation, const char *pFileName, const Color& clr ); + + // Resizes the operation column to fit the operation text + void ResizeOperationColumnToContents(); + + // Sets the column header for the 'operation' column + void SetOperationColumnHeaderText( const char *pText ); + + // Shows the panel + void DoModal( KeyValues *pContextKeyValues = NULL, const char *pMessage = NULL ); + + // Retrieves the number of files, the file names, and operations + int GetOperationCount(); + const char *GetFileName( int i ); + const char *GetOperation( int i ); + + // Retreives the description (only if it was shown) + const char *GetDescription(); + +private: + virtual bool PerformOperation() { return true; } + const char *CompletionMessage(); + void CleanUpMessage(); + + vgui::ListPanel *m_pFileBrowser; + vgui::Splitter *m_pSplitter; + vgui::TextEntry *m_pDescription; + vgui::Button *m_pYesButton; + vgui::Button *m_pNoButton; + KeyValues *m_pContextKeyValues; + CUtlString m_MessageName; + char *m_pText; +}; + + +//----------------------------------------------------------------------------- +// Purpose: Modal dialog for picker +//----------------------------------------------------------------------------- +enum PerforceAction_t +{ + PERFORCE_ACTION_NONE = -1, + PERFORCE_ACTION_FILE_ADD = 0, + PERFORCE_ACTION_FILE_EDIT, + PERFORCE_ACTION_FILE_DELETE, + PERFORCE_ACTION_FILE_REVERT, + PERFORCE_ACTION_FILE_SUBMIT, +}; + + +//----------------------------------------------------------------------------- +// Purpose: Modal dialog for picker +//----------------------------------------------------------------------------- +class CPerforceFileListFrame : public COperationFileListFrame +{ + DECLARE_CLASS_SIMPLE( CPerforceFileListFrame, COperationFileListFrame ); + +public: + CPerforceFileListFrame( vgui::Panel *pParent, const char *pTitle, const char *pColumnHeader, PerforceAction_t action ); + virtual ~CPerforceFileListFrame(); + + // Adds files to the frame + void ClearAllFiles(); + void AddFile( const char *pFullPath ); + void AddFile( const char *pRelativePath, const char *pPathId ); + + void DoModal( KeyValues *pContextKeys = NULL, const char *pMessage = NULL ); + +private: + virtual bool PerformOperation(); + + // Adds files for open, submit + void AddFileForOpen( const char *pFullPath ); + void AddFileForSubmit( const char *pFullPath, P4FileState_t state ); + + // Does the perforce operation + void PerformPerforceAction( ); + + PerforceAction_t m_Action; + CUtlVector< P4File_t > m_OpenedFiles; + CUtlString m_LastOpenedFilePathId; +}; + + +//----------------------------------------------------------------------------- +// Show the perforce query dialog +// The specified keyvalues message will be sent either +// 1) If you open the file for add/edit +// 2) If you indicate to not add a file for add but don't hit cancel +// If a specific perforce action is specified, then the dialog will only +// be displayed if that action is appropriate +//----------------------------------------------------------------------------- +void ShowPerforceQuery( vgui::Panel *pParent, const char *pFileName, vgui::Panel *pActionSignalTarget, KeyValues *pKeyValues, PerforceAction_t actionFilter = PERFORCE_ACTION_NONE ); + + +#endif // PERFORCEFILELISTFRAME_H + diff --git a/public/vgui_controls/savedocumentquery.h b/public/vgui_controls/savedocumentquery.h new file mode 100644 index 0000000..fd738f4 --- /dev/null +++ b/public/vgui_controls/savedocumentquery.h @@ -0,0 +1,37 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// This dialog asks if you want to save your work +// +//============================================================================= + +#ifndef SAVEDOCUMENTQUERY_H +#define SAVEDOCUMENTQUERY_H + +#ifdef _WIN32 +#pragma once +#endif + + +//----------------------------------------------------------------------------- +// Forward declarations +//----------------------------------------------------------------------------- +class KeyValues; +namespace vgui +{ +class Panel; +} + + +//----------------------------------------------------------------------------- +// Show the save document query dialog +// NOTE: The following commands will be posted to the action signal target: +// "OnExit" - when we want to quit +// "OnSave" - when we want to save the file +// "OnCloseNoSave" - when we want to close the file without saving it +// "commandname" - additional command send after saving (SAVEDOC_POSTCOMMAND_AFTER_SAVE) +// "OnMarkNotDirty" - when we want to mark the file not dirty +//----------------------------------------------------------------------------- +void ShowSaveDocumentQuery( vgui::Panel *pParent, const char *pFileName, const char *pFileType, int nContext, vgui::Panel *pActionSignalTarget, KeyValues *pPostSaveCommand ); + + +#endif // SAVEDOCUMENTQUERY_H diff --git a/public/vgui_controls/subrectimage.h b/public/vgui_controls/subrectimage.h new file mode 100644 index 0000000..b7738c4 --- /dev/null +++ b/public/vgui_controls/subrectimage.h @@ -0,0 +1,51 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//============================================================================= + +#ifndef SUBRECTIMAGE_H +#define SUBRECTIMAGE_H + +#ifdef _WIN32 +#pragma once +#endif + +#include "vgui_controls/Image.h" +#include "vgui/VGUI.h" + + +//----------------------------------------------------------------------------- +// Purpose: Check box image +//----------------------------------------------------------------------------- +class CSubRectImage : public vgui::Image +{ +public: + CSubRectImage( const char *filename, bool hardwareFiltered, int subx, int suby, int subw, int subh ); + virtual ~CSubRectImage(); + + void GetSize( int &wide, int &tall ); + void GetContentSize( int &wide, int &tall ); + void SetSize( int x, int y ); + void SetPos( int x, int y ); + void SetColor( Color col ); + const char *GetName(); + void Paint(); + void ForceUpload(); + vgui::HTexture GetID(); + bool IsValid(); + +private: + vgui::HTexture _id; + int sub[ 4 ]; + char *_filename; + int _pos[2]; + int _wide,_tall; + Color _color; + bool _uploaded; + bool _valid; + bool _filtered; +}; + + +#endif // SUBRECTIMAGE_H
\ No newline at end of file diff --git a/public/vgui_controls/vgui_controls.cpp b/public/vgui_controls/vgui_controls.cpp new file mode 100644 index 0000000..261ff98 --- /dev/null +++ b/public/vgui_controls/vgui_controls.cpp @@ -0,0 +1,58 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//============================================================================= +#include "vgui/IVGui.h" +#include "vgui_controls/Controls.h" + +#include "vgui_controls/AnimatingImagePanel.h" +#include "vgui_controls/BitmapImagePanel.h" +#include "vgui_controls/ExpandButton.h" +#include "vgui_controls/TreeViewListControl.h" +#include "vgui_controls/HTML.h" + +// NOTE: This has to be the last file included! +#include "tier0/memdbgon.h" + + +using namespace vgui; + +USING_BUILD_FACTORY( Button ); +USING_BUILD_FACTORY( EditablePanel ); +USING_BUILD_FACTORY( ImagePanel ); +USING_BUILD_FACTORY( Label ); +USING_BUILD_FACTORY( Panel ); +USING_BUILD_FACTORY( ToggleButton ); +USING_BUILD_FACTORY( AnimatingImagePanel ); +USING_BUILD_FACTORY( CBitmapImagePanel ); +USING_BUILD_FACTORY( CheckButton ); +USING_BUILD_FACTORY( ComboBox ); +USING_BUILD_FACTORY_ALIAS( CvarToggleCheckButton<ConVarRef>, CvarToggleCheckButton ); +USING_BUILD_FACTORY( Divider ); +USING_BUILD_FACTORY( ExpandButton ); +USING_BUILD_FACTORY( GraphPanel ); +//USING_BUILD_FACTORY_ALIAS( HTML, HTML_NoJavascript ); +//USING_BUILD_FACTORY_ALIAS( HTML, HTML_Javascript ); +USING_BUILD_FACTORY( ListPanel ); +USING_BUILD_FACTORY( ListViewPanel ); +USING_BUILD_FACTORY( Menu ); +USING_BUILD_FACTORY( MenuBar ); +USING_BUILD_FACTORY( MenuButton ); +USING_BUILD_FACTORY( MenuItem ); +USING_BUILD_FACTORY( MessageBox ); +USING_BUILD_FACTORY( ProgressBar ); +USING_BUILD_FACTORY( CircularProgressBar ); +USING_BUILD_FACTORY( RadioButton ); +USING_BUILD_FACTORY( RichText ); +USING_BUILD_FACTORY( ScalableImagePanel ); +USING_BUILD_FACTORY_ALIAS( ScrollBar, ScrollBar_Vertical ); +USING_BUILD_FACTORY_ALIAS( ScrollBar, ScrollBar_Horizontal ); +USING_BUILD_FACTORY( ScrollBar ); +USING_BUILD_FACTORY( Slider ); +USING_BUILD_FACTORY( TextEntry ); +USING_BUILD_FACTORY( TreeView ); +USING_BUILD_FACTORY( CTreeViewListControl ); +USING_BUILD_FACTORY( URLLabel ); + +int g_nYou_Must_Add_Public_Vgui_Controls_Vgui_ControlsCpp_To_Your_Project = 0; |