//========= Copyright 1996-2005, 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" #include "dmxloader/dmxelement.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 ); DECLARE_DMXELEMENT_UNPACK_NAMESPACE(vgui); 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 SetImage(IImage *image, int preOffset ); // Clears all images and sets the only remaining image to the passed in image 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 SetNoShortcutSyntax( bool bNoShortcutSyntax ); void SetAllCaps( bool bAllCaps ); virtual void GetSizerMinimumSize(int &wide, int &tall); 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); public: virtual void GetSettings( KeyValues *outResourceData ); virtual void ApplySettings( KeyValues *inResourceData ); protected: virtual const char *GetDescription( void ); MESSAGE_FUNC_PARAMS( OnDialogVariablesChanged, "DialogVariables", dialogVariables ); void HandleAutoSizing( void ); // Derived can override to, e.g., recenter text image text if there is space. virtual void RepositionTextImage( int &x, int &y, TextImage *pTextImage ) {} Alignment _contentAlignment; private: void Init(); 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 _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_bAutoTallToContents; bool m_bAutoTallDirty; bool m_bNoShortcutSyntax; bool m_bUseProportionalInsets; }; } // namespace vgui #endif // LABEL_H