/* =========================================================================== Copyright (C) 2015 the OpenMoHAA team This file is part of OpenMoHAA source code. OpenMoHAA source code is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. OpenMoHAA source code is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenMoHAA source code; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA =========================================================================== */ #pragma once #include "usignal.h" #include "../qcommon/q_shared.h" #include "../qcommon/str.h" #include "ui_public.h" #include "uirect2d.h" #include "ucolor.h" #include "uifont.h" class UIFont; class UIReggedMaterial { uihandle_t hMat; str name; bool isSet; bool isGot; public: UIReggedMaterial(); uihandle_t GetMaterial( void ); void ReregisterMaterial( void ); void CleanupMaterial( void ); void SetMaterial( const str& name ); void RefreshMaterial( void ); str GetName( void ); }; // widget flags #define WF_STRETCH_VERTICAL (1<<0) #define WF_STRETCH_HORIZONTAL (1<<1) #define WF_DIRECTED (1<<2) #define WF_TILESHADER (1<<3) #define WF_ALWAYS_BOTTOM (1<<4) #define WF_ALWAYS_TOP (1<<5) #define WF_NOPARENTADJUST (1<<6) #define WF_DONTLOCALIZE (1<<7) // widget alignment flags #define WA_LEFT (1<<0) #define WA_RIGHT (1<<1) #define WA_TOP (1<<3) #define WA_BOTTOM (1<<4) #define WA_CENTERX (1<<5) #define WA_CENTERY (1<<6) #define WA_FULL ( WA_LEFT | WA_RIGHT | WA_TOP | WA_BOTTOM | WA_CENTERX | WA_CENTERY ) typedef class UIReggedMaterial UIReggedMaterial; typedef enum { border_none, border_3D, border_indent, border_outline } borderstyle_t; typedef enum { D_NONE, D_FROM_LEFT, D_FROM_RIGHT, D_FROM_BOTTOM, D_FROM_TOP } direction_t; typedef enum { MOTION_IN, MOTION_OUT } motion_t; typedef enum { SEQUENCE_NONE, SEQUENCE_STARTING, SEQUENCE_FADEIN, SEQUENCE_HOLD, SEQUENCE_FADEOUT } fadesequence_t; class UIWidget : public USignal { friend class Menu; friend class UILayout; friend class UIWindowManager; protected: UIRect2D m_frame; vec2_t m_vVirtualScale; UIPoint2D m_startingpos; UIPoint2D m_origin; UIRect2D m_screenframe; UIPoint2D m_screenorigin; UIRect2D m_clippedframe; UIPoint2D m_clippedorigin; UColor m_background_color; UColor m_foreground_color; UBorderColor m_border_color; borderstyle_t m_borderStyle; bool m_visible; bool m_enabled; UIFont *m_font; class UIWidget *m_parent; Container m_children; str m_name; bool m_canactivate; str m_cvarname; str m_cvarvalue; str m_command; Container m_showcommands; Container m_hidecommands; str m_title; float m_indent; float m_bottomindent; UIReggedMaterial *m_material; UIReggedMaterial *m_hovermaterial; UIReggedMaterial *m_pressedmaterial; bool m_hovermaterial_active; bool m_pressedmaterial_active; direction_t m_direction; direction_t m_direction_orig; motion_t m_motiontype; float m_starttime; float m_fadetime; float m_alpha; float m_local_alpha; float m_motiontime; float m_fadeSequenceDelay; float m_fadeSequenceFadeIn; float m_fadeSequenceHold; float m_fadeSequenceFadeOut; float m_fadeSequenceRemainingTime; float m_fadeSequenceLastTime; int m_fadeSequenceState; str m_stopsound; str m_clicksound; int m_align; int m_flags; bool m_dying; int m_ordernum; int m_configstring_index; fonthorzjustify_t m_iFontAlignmentHorizontal; fontvertjustify_t m_iFontAlignmentVertical; qboolean m_bVirtual; str m_enabledCvar; // // New since 2.0 // cvar_t* m_scaleCvar; public: CLASS_PROTOTYPE( UIWidget ); void( *m_commandhandler ) ( const char *, void * ); protected: bool addChild( UIWidget *widget ); bool removeChild( UIWidget *widget ); void PropogateCoordinateSystem( void ); void set2D( void ); virtual void Draw( void ); virtual void FrameInitialized( void ); void DrawTitle( float x, float y ); void Motion( void ); virtual void AlignPosition( void ); void Hide( Event *ev ); void Activate( Event *ev ); void BringToFront( void ); static void SplitWidgets( Container& src, Container& bottom, Container& normal, Container& top ); static void CombineWidgets( Container& dst, Container& bottom, Container& normal, Container& top ); static void ArrangeWidgetList( Container& list ); public: UIWidget(); virtual ~UIWidget(); virtual void Shutdown( void ); virtual void InitFrame( UIWidget *parentview, float x, float y, float width, float height, int border = -1, const char *fontname = "verdana-12" ); void InitFrame( UIWidget *parentview, const UIRect2D& r, int border, const char *fontname = "verdana-12" ); void LayoutSize( Event *ev ); void LayoutRect( Event *ev ); void LayoutName( Event *ev ); void LayoutTitle( Event *ev ); void LayoutFont( Event *ev ); void LayoutBgColor( Event *ev ); void LayoutFgColor( Event *ev ); void LayoutBorderStyle( Event *ev ); void LayoutBorderColor( Event *ev ); void LayoutShader( Event *ev ); void LayoutTileShader( Event *ev ); void LayoutHoverShader( Event *ev ); void LayoutPressedShader( Event *ev ); void LayoutFadeIn( Event *ev ); void LayoutStopSound( Event *ev ); void LayoutClickSound( Event *ev ); void LayoutStretch( Event *ev ); void LayoutVirtualRes( Event *ev ); void LayoutInitData( Event *ev ); void LayoutDirection( Event *ev ); void LayoutAlign( Event *ev ); void LayoutStuffCommand( Event *ev ); void LayoutLinkCvar( Event *ev ); void LayoutNoParentClipping( Event *ev ); void LayoutNoParentAdjustment( Event *ev ); void LayoutOrderNumber( Event *ev ); void TextAlignment( Event *ev ); void LayoutAliasCache( Event *ev ); void SetEnabledCvar( Event *ev ); void SetScaleCvar( Event *ev ); // Added in 2.0 //==== void SetDontLocalize( Event *ev ); void EventFadeSequence( Event *ev ); //==== void SetVirtualScale(vec2_t out); void SetDontLocalize(); void setParent( UIWidget *parent ); class UIWidget *getParent( void ); class UIWidget *getFirstChild( void ); class UIWidget *getNextSibling( void ); class UIWidget *getNextChild( UIWidget *child ); class UIWidget *getPrevChild( UIWidget *child ); class UIWidget *getPrevSibling( void ); class UIWidget *getPrevSibling( UIWidget *curr ); class UIWidget *getLastSibling( void ); class UIWidget *findSibling( str name ); void Enable( void ); void Disable( void ); bool isEnabled( void ); bool IsDying( void ); class UIWidget *FindResponder( const UIPoint2D& pos ); void setFont( const char *name ); void setFontHorizontalAlignment( fonthorzjustify_t alignment ); void setFontVerticalAlignment( fontvertjustify_t alignment ); void setShow( bool visible ); bool getShow( void ); class UColor getBackgroundColor( void ); virtual void setBackgroundColor( const UColor& color, bool setbordercolor ); class UBorderColor getBorderColor( void ); void setBorderColor( const UBorderColor& color ); class UColor getForegroundColor( void ); virtual void setForegroundColor( const UColor& color ); borderstyle_t getBorderStyle( void ); void setBorderStyle( borderstyle_t style ); class UISize2D getSize( void ); void setSize( const UISize2D& newsize ); class UIRect2D getFrame( void ); void setFrame( const UIRect2D& newframe ); class UIPoint2D getOrigin( void ); void setOrigin( const UIPoint2D& neworigin ); void setName( str name ); const char *getName( void ); void setTitle( str title ); const char *getTitle( void ); void setDirection( direction_t dir ); direction_t getDirection( void ); void setMotionType( motion_t type ); motion_t getMotionType( void ); void setMotionTime( float time ); float getMotionTime( void ); void setAlign( int align ); int getAlign( void ); void setMaterial( UIReggedMaterial *mat ); void setHoverMaterial( UIReggedMaterial *mat ); void setPressedMaterial( UIReggedMaterial *mat ); class UIPoint2D getLocalPoint( const UIPoint2D& pos ); class UIPoint2D getGlobalPoint( const UIPoint2D& pos ); virtual void setBackgroundAlpha( float f ); float getBackgroundAlpha( void ); void Display( const UIRect2D& drawframe, float parent_alpha ); virtual qboolean KeyEvent( int key, unsigned int time ); virtual void CharEvent( int ch ); virtual void UpdateData( void ); virtual void UpdateUIElement( void ); float getTitleWidth( void ); float getTitleHeight( void ); bool CanActivate( void ); void AllowActivate( bool canactivate ); bool IsActive( void ); bool IsVisible( void ); virtual void LinkCvar( str cvarname ); void LinkCommand( str cmd ); void ExecuteShowCommands( void ); void ExecuteHideCommands( void ); void InitializeCommandHandler( void( *fcn) ( const char *, void * ) ); class UIWidget *FindWidget( str name ); void ResetMotion( motion_t type ); virtual void Realign( void ); void BringToFrontPropogated( void ); class UIWidget *IsThisOrChildActive( void ); class UIPoint2D MouseEventToClientPoint( Event *ev ); class UIRect2D getClientFrame( void ); void setAlwaysOnBottom( bool b ); void setAlwaysOnTop( bool b ); bool getAlwaysOnBottom( void ); bool getAlwaysOnTop( void ); bool SendSignal( Event& event ); void ShowCommand( Event *ev ); void HideCommand( Event *ev ); void AddFlag( int flag ); void SetHovermaterialActive( bool a ); void SetPressedmaterialActive( bool a ); int getOrderNum( void ); class str getCommand( void ); void ActivateOrder( void ); void EnableEvent( Event *ev ); void DisableEvent( Event *ev ); void setConfigstringIndex( int cs ); int getConfigstringIndex( void ); bool PassEventToWidget( str name, Event *ev ); // Added in OPM UIFont *getFont() const; bool isVirtual() const; const vec2_t& getVirtualScale() const; const vec2_t& getHighResScale() const; }; class UIWidgetContainer : public UIWidget { UColor m_bgfill; qboolean m_fullscreen; int m_vidmode; int m_currentwidnum; int m_maxordernum; public: class UILayout *m_layout; CLASS_PROTOTYPE( UIWidgetContainer ); private: void AlignPosition( void ) override; void Draw( void ) override; public: UIWidgetContainer(); void Realign( void ) override; void SetBGFill( Event *ev ); void SetFullscreen( Event *ev ); void SetVidMode( Event *ev ); int getVidMode( void ); qboolean isFullscreen( void ); UIWidget *GetNextWidgetInOrder( void ); UIWidget *GetPrevWidgetInOrder( void ); void SetActiveWidgetOrderNum( UIWidget *wid ); void SetActiveWidgetOrderNum( int num ); void SetLastActiveWidgetOrderNum( void ); }; extern Event W_Destroyed; extern Event W_SizeChanged; extern Event W_FrameChanged; extern Event W_OriginChanged; extern Event W_Activated; extern Event EV_Widget_Activate; extern Event W_Deactivated; extern Event EV_Widget_Hide; extern Event EV_Widget_Enable; extern Event EV_Widget_Disable; extern Event W_RealignWidget; extern Event W_Draw; extern Event EV_Layout_Size; extern Event EV_Layout_Rect; extern Event EV_Layout_Name; extern Event EV_Layout_Title; extern Event EV_Layout_Font; extern Event EV_Layout_BGColor; extern Event EV_Layout_FGColor; extern Event EV_Layout_Borderstyle; extern Event EV_Layout_BorderColor; extern Event EV_Layout_Shader; extern Event EV_Layout_TileShader; extern Event EV_Layout_HoverShader; extern Event EV_Layout_PressedShader; extern Event EV_Layout_FadeIn; extern Event EV_Layout_StopSound; extern Event EV_Layout_ClickSound; extern Event EV_Layout_Stretch; extern Event EV_Layout_VirtualRes; extern Event EV_Layout_InitData; extern Event EV_Layout_Direction; extern Event EV_Layout_Align; extern Event EV_Layout_StuffCommand; extern Event EV_Layout_LinkCvar; extern Event EV_Layout_NoParentClipping; extern Event EV_Layout_NoParentAdjustment; extern Event EV_Widget_HideCommand; extern Event EV_Widget_ShowCommand; extern Event EV_Widget_OrderNumber; extern Event EV_Widget_TextAlignment; extern Event EV_Widget_EnabledCvar; extern Event EV_Layout_AliasCache; extern Event EV_Layout_BGFill; extern Event EV_Layout_Fullscreen; extern Event EV_Layout_VidMode; void SetColor( const UColor& color, float alpha ); void DrawBox( const UIRect2D& rect, const UColor& color, float alpha ); void Draw3DBox( const UIRect2D& rect, bool indent, const UBorderColor& color, float alpha ); void DrawBox( float x, float y, float width, float height, const UColor &color, float alpha ); void Draw3DBox( float x, float y, float width, float height, bool indent, const UBorderColor& color, float alpha ); void DrawMac3DBox( const UIRect2D& rect, bool indent, const UBorderColor& color, int inset, float alpha ); void DrawBoxWithSolidBorder( const UIRect2D& rect, const UColor& inside, const UColor& outside, int size, int flags, float alpha );