2017-10-27 19:54:56 +02:00
// dear imgui, v1.53 WIP
2015-12-24 19:56:47 +01:00
// (internals)
2015-07-22 01:00:28 +02:00
2015-12-24 19:56:47 +01:00
// You may use this file to debug, understand or extend ImGui features but we don't provide any guarantee of forward compatibility!
2017-11-07 13:11:45 +01:00
// Set:
2015-07-31 06:49:10 +02:00
// #define IMGUI_DEFINE_MATH_OPERATORS
2017-11-07 13:11:45 +01:00
// To implement maths operators for ImVec2 (disabled by default to not collide with using IM_VEC2_CLASS_EXTRA along with your own math types+operators)
2015-07-22 01:00:28 +02:00
# pragma once
2015-08-10 18:26:39 +02:00
# ifndef IMGUI_VERSION
# error Must include imgui.h before imgui_internal.h
# endif
2015-07-22 01:00:28 +02:00
# include <stdio.h> // FILE*
2016-05-31 00:00:44 +02:00
# include <math.h> // sqrtf, fabsf, fmodf, powf, floorf, ceilf, cosf, sinf
2016-07-20 00:02:59 +02:00
# include <limits.h> // INT_MIN, INT_MAX
2015-07-22 01:00:28 +02:00
2015-09-22 00:53:51 +02:00
# ifdef _MSC_VER
# pragma warning (push)
# pragma warning (disable: 4251) // class 'xxx' needs to have dll-interface to be used by clients of struct 'xxx' // when IMGUI_API is set to__declspec(dllexport)
# endif
2016-05-29 19:14:19 +02:00
# ifdef __clang__
# pragma clang diagnostic push
# pragma clang diagnostic ignored "-Wunused-function" // for stb_textedit.h
# pragma clang diagnostic ignored "-Wmissing-prototypes" // for stb_textedit.h
# pragma clang diagnostic ignored "-Wold-style-cast"
# endif
2015-07-22 01:00:28 +02:00
//-----------------------------------------------------------------------------
// Forward Declarations
//-----------------------------------------------------------------------------
struct ImRect ;
struct ImGuiColMod ;
struct ImGuiStyleMod ;
struct ImGuiGroupData ;
struct ImGuiSimpleColumns ;
struct ImGuiDrawContext ;
struct ImGuiTextEditState ;
struct ImGuiIniData ;
struct ImGuiMouseCursorData ;
struct ImGuiPopupRef ;
struct ImGuiWindow ;
2017-10-27 15:31:44 +02:00
typedef int ImGuiLayoutType ; // enum: horizontal or vertical // enum ImGuiLayoutType_
typedef int ImGuiButtonFlags ; // flags: for ButtonEx(), ButtonBehavior() // enum ImGuiButtonFlags_
typedef int ImGuiItemFlags ; // flags: for PushItemFlag() // enum ImGuiItemFlags_
2017-10-27 16:42:06 +02:00
typedef int ImGuiNavHighlightFlags ; // flags: for RenderNavHighlight() // enum ImGuiNavHighlightFlags_
2017-10-27 15:31:44 +02:00
typedef int ImGuiSeparatorFlags ; // flags: for Separator() - internal // enum ImGuiSeparatorFlags_
typedef int ImGuiSliderFlags ; // flags: for SliderBehavior() // enum ImGuiSliderFlags_
2015-07-22 01:00:28 +02:00
//-------------------------------------------------------------------------
2015-07-31 06:49:10 +02:00
// STB libraries
2015-07-22 01:00:28 +02:00
//-------------------------------------------------------------------------
namespace ImGuiStb
{
# undef STB_TEXTEDIT_STRING
# undef STB_TEXTEDIT_CHARTYPE
# define STB_TEXTEDIT_STRING ImGuiTextEditState
# define STB_TEXTEDIT_CHARTYPE ImWchar
# define STB_TEXTEDIT_GETWIDTH_NEWLINE -1.0f
# include "stb_textedit.h"
} // namespace ImGuiStb
//-----------------------------------------------------------------------------
// Context
//-----------------------------------------------------------------------------
2016-11-12 17:08:31 +01:00
# ifndef GImGui
extern IMGUI_API ImGuiContext * GImGui ; // Current implicit ImGui context pointer
# endif
2015-07-22 01:00:28 +02:00
//-----------------------------------------------------------------------------
// Helpers
//-----------------------------------------------------------------------------
2017-10-26 16:12:53 +02:00
# define IM_PI 3.14159265358979323846f
# define IM_OFFSETOF(_TYPE,_ELM) ((size_t)&(((_TYPE*)0)->_ELM))
2015-07-22 01:00:28 +02:00
// Helpers: UTF-8 <> wchar
2015-09-10 11:22:17 +02:00
IMGUI_API int ImTextStrToUtf8 ( char * buf , int buf_size , const ImWchar * in_text , const ImWchar * in_text_end ) ; // return output UTF-8 bytes count
IMGUI_API int ImTextCharFromUtf8 ( unsigned int * out_char , const char * in_text , const char * in_text_end ) ; // return input UTF-8 bytes count
IMGUI_API int ImTextStrFromUtf8 ( ImWchar * buf , int buf_size , const char * in_text , const char * in_text_end , const char * * in_remaining = NULL ) ; // return input UTF-8 bytes count
IMGUI_API int ImTextCountCharsFromUtf8 ( const char * in_text , const char * in_text_end ) ; // return number of UTF-8 code-points (NOT bytes count)
IMGUI_API int ImTextCountUtf8BytesFromStr ( const ImWchar * in_text , const ImWchar * in_text_end ) ; // return number of bytes to express string as UTF-8 code-points
2015-07-22 01:00:28 +02:00
// Helpers: Misc
2015-09-10 11:22:17 +02:00
IMGUI_API ImU32 ImHash ( const void * data , int data_size , ImU32 seed = 0 ) ; // Pass data_size==0 for zero-terminated strings
2017-01-14 13:47:16 +01:00
IMGUI_API void * ImFileLoadToMemory ( const char * filename , const char * file_open_mode , int * out_file_size = NULL , int padding_bytes = 0 ) ;
2017-07-31 15:11:41 +02:00
IMGUI_API FILE * ImFileOpen ( const char * filename , const char * file_open_mode ) ;
2015-09-10 11:22:17 +02:00
static inline bool ImCharIsSpace ( int c ) { return c = = ' ' | | c = = ' \t ' | | c = = 0x3000 ; }
2016-02-21 23:23:30 +01:00
static inline bool ImIsPowerOfTwo ( int v ) { return v ! = 0 & & ( v & ( v - 1 ) ) = = 0 ; }
2015-09-10 11:22:17 +02:00
static inline int ImUpperPowerOfTwo ( int v ) { v - - ; v | = v > > 1 ; v | = v > > 2 ; v | = v > > 4 ; v | = v > > 8 ; v | = v > > 16 ; v + + ; return v ; }
2015-07-22 01:00:28 +02:00
2017-07-31 15:11:41 +02:00
// Helpers: Geometry
IMGUI_API ImVec2 ImLineClosestPoint ( const ImVec2 & a , const ImVec2 & b , const ImVec2 & p ) ;
IMGUI_API bool ImTriangleContainsPoint ( const ImVec2 & a , const ImVec2 & b , const ImVec2 & c , const ImVec2 & p ) ;
IMGUI_API ImVec2 ImTriangleClosestPoint ( const ImVec2 & a , const ImVec2 & b , const ImVec2 & c , const ImVec2 & p ) ;
IMGUI_API void ImTriangleBarycentricCoords ( const ImVec2 & a , const ImVec2 & b , const ImVec2 & c , const ImVec2 & p , float & out_u , float & out_v , float & out_w ) ;
2015-07-22 01:00:28 +02:00
// Helpers: String
2015-09-10 11:22:17 +02:00
IMGUI_API int ImStricmp ( const char * str1 , const char * str2 ) ;
IMGUI_API int ImStrnicmp ( const char * str1 , const char * str2 , int count ) ;
2017-10-17 23:18:20 +02:00
IMGUI_API void ImStrncpy ( char * dst , const char * src , int count ) ;
2015-09-10 11:22:17 +02:00
IMGUI_API char * ImStrdup ( const char * str ) ;
IMGUI_API int ImStrlenW ( const ImWchar * str ) ;
IMGUI_API const ImWchar * ImStrbolW ( const ImWchar * buf_mid_line , const ImWchar * buf_begin ) ; // Find beginning-of-line
IMGUI_API const char * ImStristr ( const char * haystack , const char * haystack_end , const char * needle , const char * needle_end ) ;
2017-08-25 10:10:14 +02:00
IMGUI_API int ImFormatString ( char * buf , int buf_size , const char * fmt , . . . ) IM_FMTARGS ( 3 ) ;
IMGUI_API int ImFormatStringV ( char * buf , int buf_size , const char * fmt , va_list args ) IM_FMTLIST ( 3 ) ;
2015-07-22 01:00:28 +02:00
// Helpers: Math
// We are keeping those not leaking to the user by default, in the case the user has implicit cast operators between ImVec2 and its own types (when IM_VEC2_CLASS_EXTRA is defined)
# ifdef IMGUI_DEFINE_MATH_OPERATORS
static inline ImVec2 operator * ( const ImVec2 & lhs , const float rhs ) { return ImVec2 ( lhs . x * rhs , lhs . y * rhs ) ; }
static inline ImVec2 operator / ( const ImVec2 & lhs , const float rhs ) { return ImVec2 ( lhs . x / rhs , lhs . y / rhs ) ; }
static inline ImVec2 operator + ( const ImVec2 & lhs , const ImVec2 & rhs ) { return ImVec2 ( lhs . x + rhs . x , lhs . y + rhs . y ) ; }
static inline ImVec2 operator - ( const ImVec2 & lhs , const ImVec2 & rhs ) { return ImVec2 ( lhs . x - rhs . x , lhs . y - rhs . y ) ; }
static inline ImVec2 operator * ( const ImVec2 & lhs , const ImVec2 & rhs ) { return ImVec2 ( lhs . x * rhs . x , lhs . y * rhs . y ) ; }
static inline ImVec2 operator / ( const ImVec2 & lhs , const ImVec2 & rhs ) { return ImVec2 ( lhs . x / rhs . x , lhs . y / rhs . y ) ; }
static inline ImVec2 & operator + = ( ImVec2 & lhs , const ImVec2 & rhs ) { lhs . x + = rhs . x ; lhs . y + = rhs . y ; return lhs ; }
static inline ImVec2 & operator - = ( ImVec2 & lhs , const ImVec2 & rhs ) { lhs . x - = rhs . x ; lhs . y - = rhs . y ; return lhs ; }
static inline ImVec2 & operator * = ( ImVec2 & lhs , const float rhs ) { lhs . x * = rhs ; lhs . y * = rhs ; return lhs ; }
static inline ImVec2 & operator / = ( ImVec2 & lhs , const float rhs ) { lhs . x / = rhs ; lhs . y / = rhs ; return lhs ; }
2017-10-27 13:19:31 +02:00
static inline ImVec4 operator + ( const ImVec4 & lhs , const ImVec4 & rhs ) { return ImVec4 ( lhs . x + rhs . x , lhs . y + rhs . y , lhs . z + rhs . z , lhs . w + rhs . w ) ; }
2015-11-11 00:06:37 +01:00
static inline ImVec4 operator - ( const ImVec4 & lhs , const ImVec4 & rhs ) { return ImVec4 ( lhs . x - rhs . x , lhs . y - rhs . y , lhs . z - rhs . z , lhs . w - rhs . w ) ; }
2017-10-27 13:19:31 +02:00
static inline ImVec4 operator * ( const ImVec4 & lhs , const ImVec4 & rhs ) { return ImVec4 ( lhs . x * rhs . x , lhs . y * rhs . y , lhs . z * rhs . z , lhs . w * rhs . w ) ; }
2015-07-22 01:00:28 +02:00
# endif
static inline int ImMin ( int lhs , int rhs ) { return lhs < rhs ? lhs : rhs ; }
static inline int ImMax ( int lhs , int rhs ) { return lhs > = rhs ? lhs : rhs ; }
static inline float ImMin ( float lhs , float rhs ) { return lhs < rhs ? lhs : rhs ; }
static inline float ImMax ( float lhs , float rhs ) { return lhs > = rhs ? lhs : rhs ; }
static inline ImVec2 ImMin ( const ImVec2 & lhs , const ImVec2 & rhs ) { return ImVec2 ( ImMin ( lhs . x , rhs . x ) , ImMin ( lhs . y , rhs . y ) ) ; }
static inline ImVec2 ImMax ( const ImVec2 & lhs , const ImVec2 & rhs ) { return ImVec2 ( ImMax ( lhs . x , rhs . x ) , ImMax ( lhs . y , rhs . y ) ) ; }
static inline int ImClamp ( int v , int mn , int mx ) { return ( v < mn ) ? mn : ( v > mx ) ? mx : v ; }
static inline float ImClamp ( float v , float mn , float mx ) { return ( v < mn ) ? mn : ( v > mx ) ? mx : v ; }
static inline ImVec2 ImClamp ( const ImVec2 & f , const ImVec2 & mn , ImVec2 mx ) { return ImVec2 ( ImClamp ( f . x , mn . x , mx . x ) , ImClamp ( f . y , mn . y , mx . y ) ) ; }
static inline float ImSaturate ( float f ) { return ( f < 0.0f ) ? 0.0f : ( f > 1.0f ) ? 1.0f : f ; }
2017-10-17 23:18:20 +02:00
static inline void ImSwap ( int & a , int & b ) { int tmp = a ; a = b ; b = tmp ; }
2017-08-28 13:27:12 +02:00
static inline void ImSwap ( float & a , float & b ) { float tmp = a ; a = b ; b = tmp ; }
2017-07-26 16:20:43 +02:00
static inline int ImLerp ( int a , int b , float t ) { return ( int ) ( a + ( b - a ) * t ) ; }
2015-07-22 01:00:28 +02:00
static inline float ImLerp ( float a , float b , float t ) { return a + ( b - a ) * t ; }
2017-07-31 12:56:51 +02:00
static inline ImVec2 ImLerp ( const ImVec2 & a , const ImVec2 & b , float t ) { return ImVec2 ( a . x + ( b . x - a . x ) * t , a . y + ( b . y - a . y ) * t ) ; }
2015-07-22 01:00:28 +02:00
static inline ImVec2 ImLerp ( const ImVec2 & a , const ImVec2 & b , const ImVec2 & t ) { return ImVec2 ( a . x + ( b . x - a . x ) * t . x , a . y + ( b . y - a . y ) * t . y ) ; }
2017-10-19 23:29:27 +02:00
static inline ImVec4 ImLerp ( const ImVec4 & a , const ImVec4 & b , float t ) { return ImVec4 ( a . x + ( b . x - a . x ) * t , a . y + ( b . y - a . y ) * t , a . z + ( b . z - a . z ) * t , a . w + ( b . w - a . w ) * t ) ; }
2015-07-22 01:00:28 +02:00
static inline float ImLengthSqr ( const ImVec2 & lhs ) { return lhs . x * lhs . x + lhs . y * lhs . y ; }
static inline float ImLengthSqr ( const ImVec4 & lhs ) { return lhs . x * lhs . x + lhs . y * lhs . y + lhs . z * lhs . z + lhs . w * lhs . w ; }
static inline float ImInvLength ( const ImVec2 & lhs , float fail_value ) { float d = lhs . x * lhs . x + lhs . y * lhs . y ; if ( d > 0.0f ) return 1.0f / sqrtf ( d ) ; return fail_value ; }
2016-04-30 18:55:23 +02:00
static inline float ImFloor ( float f ) { return ( float ) ( int ) f ; }
2017-07-31 12:56:51 +02:00
static inline ImVec2 ImFloor ( const ImVec2 & v ) { return ImVec2 ( ( float ) ( int ) v . x , ( float ) ( int ) v . y ) ; }
static inline float ImDot ( const ImVec2 & a , const ImVec2 & b ) { return a . x * b . x + a . y * b . y ; }
static inline ImVec2 ImRotate ( const ImVec2 & v , float cos_a , float sin_a ) { return ImVec2 ( v . x * cos_a - v . y * sin_a , v . x * sin_a + v . y * cos_a ) ; }
2017-10-19 19:29:59 +02:00
static inline float ImLinearSweep ( float current , float target , float speed ) { if ( current < target ) return ImMin ( current + speed , target ) ; if ( current > target ) return ImMax ( current - speed , target ) ; return current ; }
2017-11-19 21:00:38 +01:00
static inline ImVec2 ImMul ( const ImVec2 & lhs , const ImVec2 & rhs ) { return ImVec2 ( lhs . x * rhs . x , lhs . y * rhs . y ) ; }
2015-07-22 01:00:28 +02:00
2016-01-25 22:26:53 +01:00
// We call C++ constructor on own allocated memory via the placement "new(ptr) Type()" syntax.
// Defining a custom placement new() with a dummy parameter allows us to bypass including <new> which on some platforms complains when user has disabled exceptions.
struct ImPlacementNewDummy { } ;
2016-01-25 22:45:45 +01:00
inline void * operator new ( size_t , ImPlacementNewDummy , void * ptr ) { return ptr ; }
inline void operator delete ( void * , ImPlacementNewDummy , void * ) { }
2016-05-07 19:54:27 +02:00
# define IM_PLACEMENT_NEW(_PTR) new(ImPlacementNewDummy(), _PTR)
2016-01-25 22:26:53 +01:00
2015-07-22 01:00:28 +02:00
//-----------------------------------------------------------------------------
2015-07-31 06:49:10 +02:00
// Types
2015-07-22 01:00:28 +02:00
//-----------------------------------------------------------------------------
2017-09-28 19:18:41 +02:00
// NB: Most of those flags are handled by ButtonBehavior(), but some as for the higher level ButtonEx() function only.
2015-07-22 01:00:28 +02:00
enum ImGuiButtonFlags_
{
2016-03-03 00:30:08 +01:00
ImGuiButtonFlags_Repeat = 1 < < 0 , // hold to repeat
2017-09-28 19:35:10 +02:00
ImGuiButtonFlags_PressedOnClickRelease = 1 < < 1 , // return true on click + release on same item [DEFAULT if no PressedOn* flag is set]
ImGuiButtonFlags_PressedOnClick = 1 < < 2 , // return true on click (default requires click+release)
ImGuiButtonFlags_PressedOnRelease = 1 < < 3 , // return true on release (default requires click+release)
ImGuiButtonFlags_PressedOnDoubleClick = 1 < < 4 , // return true on double-click (default requires click+release)
ImGuiButtonFlags_FlattenChilds = 1 < < 5 , // allow interactions even if a child window is overlapping
ImGuiButtonFlags_DontClosePopups = 1 < < 6 , // disable automatically closing parent popup on press // [UNUSED]
ImGuiButtonFlags_Disabled = 1 < < 7 , // disable interactions
2017-09-29 16:30:43 +02:00
ImGuiButtonFlags_AlignTextBaseLine = 1 < < 8 , // vertically align button to match text baseline - ButtonEx() only // FIXME: Should be removed and handled by SmallButton(), not possible currently because of DC.CursorPosPrevLine
2016-05-01 17:43:51 +02:00
ImGuiButtonFlags_NoKeyModifiers = 1 < < 9 , // disable interaction if a key modifier is held
2016-07-20 00:02:59 +02:00
ImGuiButtonFlags_AllowOverlapMode = 1 < < 10 , // require previous frame HoveredId to either match id or be null before being usable
2017-10-18 13:09:28 +02:00
ImGuiButtonFlags_NoHoldingActiveID = 1 < < 11 , // don't set ActiveId while holding the mouse (ImGuiButtonFlags_PressedOnClick only)
ImGuiButtonFlags_NoNavFocus = 1 < < 12 // don't override navigation focus when activated
2015-08-29 19:13:30 +02:00
} ;
2015-10-30 11:43:23 +01:00
enum ImGuiSliderFlags_
{
2015-12-26 14:59:07 +01:00
ImGuiSliderFlags_Vertical = 1 < < 0
2015-10-30 11:43:23 +01:00
} ;
2017-08-20 12:44:48 +02:00
enum ImGuiColumnsFlags_
{
// Default: 0
ImGuiColumnsFlags_NoBorder = 1 < < 0 , // Disable column dividers
2017-08-20 13:32:18 +02:00
ImGuiColumnsFlags_NoResize = 1 < < 1 , // Disable resizing columns when clicking on the dividers
ImGuiColumnsFlags_NoPreserveWidths = 1 < < 2 , // Disable column width preservation when adjusting columns
2017-11-16 17:34:34 +01:00
ImGuiColumnsFlags_NoForceWithinWindow = 1 < < 3 , // Disable forcing columns to fit within window
ImGuiColumnsFlags_GrowParentContentsSize = 1 < < 4 , // (WIP) Restore pre-1.51 behavior of extending the parent window contents size but _without affecting the columns width at all_. Will eventually remove.
2017-08-20 12:44:48 +02:00
} ;
2015-07-22 01:00:28 +02:00
enum ImGuiSelectableFlagsPrivate_
{
// NB: need to be in sync with last value of ImGuiSelectableFlags_
2017-10-04 19:45:35 +02:00
ImGuiSelectableFlags_Menu = 1 < < 3 , // -> PressedOnClick
ImGuiSelectableFlags_MenuItem = 1 < < 4 , // -> PressedOnRelease
2016-01-31 22:08:35 +01:00
ImGuiSelectableFlags_Disabled = 1 < < 5 ,
ImGuiSelectableFlags_DrawFillAvailWidth = 1 < < 6
2015-07-22 01:00:28 +02:00
} ;
2017-09-26 15:43:48 +02:00
enum ImGuiSeparatorFlags_
{
ImGuiSeparatorFlags_Horizontal = 1 < < 0 , // Axis default to current layout type, so generally Horizontal unless e.g. in a menu bar
ImGuiSeparatorFlags_Vertical = 1 < < 1
} ;
2015-07-22 01:00:28 +02:00
// FIXME: this is in development, not exposed/functional as a generic feature yet.
enum ImGuiLayoutType_
{
ImGuiLayoutType_Vertical ,
ImGuiLayoutType_Horizontal
} ;
2017-11-20 19:39:27 +01:00
enum ImGuiAxis
{
ImGuiAxis_None = - 1 ,
ImGuiAxis_X = 0 ,
ImGuiAxis_Y = 1 ,
} ;
2015-08-02 05:57:24 +02:00
enum ImGuiPlotType
{
ImGuiPlotType_Lines ,
ImGuiPlotType_Histogram
} ;
2015-08-06 00:57:31 +02:00
enum ImGuiDataType
{
ImGuiDataType_Int ,
2016-09-25 11:06:14 +02:00
ImGuiDataType_Float ,
2017-09-14 05:35:30 +02:00
ImGuiDataType_Float2
2015-08-06 00:57:31 +02:00
} ;
2016-07-20 00:02:59 +02:00
enum ImGuiInputSource
{
ImGuiInputSource_None = 0 ,
ImGuiInputSource_Mouse ,
ImGuiInputSource_Nav ,
2016-08-21 12:44:59 +02:00
ImGuiInputSource_Count_ ,
2016-07-20 00:02:59 +02:00
} ;
2017-07-30 10:15:52 +02:00
enum ImGuiDir
2016-07-20 00:02:59 +02:00
{
2017-07-30 10:15:52 +02:00
ImGuiDir_None = - 1 ,
ImGuiDir_Left = 0 ,
ImGuiDir_Right = 1 ,
ImGuiDir_Up = 2 ,
2017-09-14 05:35:30 +02:00
ImGuiDir_Down = 3
2016-07-20 00:02:59 +02:00
} ;
2017-10-03 22:54:19 +02:00
enum ImGuiNavHighlightFlags_
{
ImGuiNavHighlightFlags_TypeDefault = 1 < < 0 ,
ImGuiNavHighlightFlags_TypeThin = 1 < < 1 ,
2017-10-11 19:05:36 +02:00
ImGuiNavHighlightFlags_AlwaysDraw = 1 < < 2
2017-10-03 22:54:19 +02:00
} ;
2015-07-22 01:00:28 +02:00
// 2D axis aligned bounding-box
2015-08-05 18:00:05 +02:00
// NB: we can't rely on ImVec2 math operators being available here
2015-09-10 11:22:17 +02:00
struct IMGUI_API ImRect
2015-07-22 01:00:28 +02:00
{
2015-11-29 23:01:26 +01:00
ImVec2 Min ; // Upper-left
ImVec2 Max ; // Lower-right
2015-07-22 01:00:28 +02:00
ImRect ( ) : Min ( FLT_MAX , FLT_MAX ) , Max ( - FLT_MAX , - FLT_MAX ) { }
ImRect ( const ImVec2 & min , const ImVec2 & max ) : Min ( min ) , Max ( max ) { }
ImRect ( const ImVec4 & v ) : Min ( v . x , v . y ) , Max ( v . z , v . w ) { }
ImRect ( float x1 , float y1 , float x2 , float y2 ) : Min ( x1 , y1 ) , Max ( x2 , y2 ) { }
2015-11-29 23:01:26 +01:00
ImVec2 GetCenter ( ) const { return ImVec2 ( ( Min . x + Max . x ) * 0.5f , ( Min . y + Max . y ) * 0.5f ) ; }
ImVec2 GetSize ( ) const { return ImVec2 ( Max . x - Min . x , Max . y - Min . y ) ; }
float GetWidth ( ) const { return Max . x - Min . x ; }
float GetHeight ( ) const { return Max . y - Min . y ; }
ImVec2 GetTL ( ) const { return Min ; } // Top-left
ImVec2 GetTR ( ) const { return ImVec2 ( Max . x , Min . y ) ; } // Top-right
ImVec2 GetBL ( ) const { return ImVec2 ( Min . x , Max . y ) ; } // Bottom-left
ImVec2 GetBR ( ) const { return Max ; } // Bottom-right
bool Contains ( const ImVec2 & p ) const { return p . x > = Min . x & & p . y > = Min . y & & p . x < Max . x & & p . y < Max . y ; }
bool Contains ( const ImRect & r ) const { return r . Min . x > = Min . x & & r . Min . y > = Min . y & & r . Max . x < Max . x & & r . Max . y < Max . y ; }
bool Overlaps ( const ImRect & r ) const { return r . Min . y < Max . y & & r . Max . y > Min . y & & r . Min . x < Max . x & & r . Max . x > Min . x ; }
void Add ( const ImVec2 & rhs ) { if ( Min . x > rhs . x ) Min . x = rhs . x ; if ( Min . y > rhs . y ) Min . y = rhs . y ; if ( Max . x < rhs . x ) Max . x = rhs . x ; if ( Max . y < rhs . y ) Max . y = rhs . y ; }
void Add ( const ImRect & rhs ) { if ( Min . x > rhs . Min . x ) Min . x = rhs . Min . x ; if ( Min . y > rhs . Min . y ) Min . y = rhs . Min . y ; if ( Max . x < rhs . Max . x ) Max . x = rhs . Max . x ; if ( Max . y < rhs . Max . y ) Max . y = rhs . Max . y ; }
void Expand ( const float amount ) { Min . x - = amount ; Min . y - = amount ; Max . x + = amount ; Max . y + = amount ; }
void Expand ( const ImVec2 & amount ) { Min . x - = amount . x ; Min . y - = amount . y ; Max . x + = amount . x ; Max . y + = amount . y ; }
2016-08-21 14:37:48 +02:00
void Translate ( const ImVec2 & v ) { Min . x + = v . x ; Min . y + = v . y ; Max . x + = v . x ; Max . y + = v . y ; }
2017-08-22 11:46:50 +02:00
void ClipWith ( const ImRect & clip ) { if ( Min . x < clip . Min . x ) Min . x = clip . Min . x ; if ( Min . y < clip . Min . y ) Min . y = clip . Min . y ; if ( Max . x > clip . Max . x ) Max . x = clip . Max . x ; if ( Max . y > clip . Max . y ) Max . y = clip . Max . y ; }
2016-04-23 14:10:36 +02:00
void Floor ( ) { Min . x = ( float ) ( int ) Min . x ; Min . y = ( float ) ( int ) Min . y ; Max . x = ( float ) ( int ) Max . x ; Max . y = ( float ) ( int ) Max . y ; }
2015-11-29 23:01:26 +01:00
ImVec2 GetClosestPoint ( ImVec2 p , bool on_edge ) const
2015-07-22 01:00:28 +02:00
{
if ( ! on_edge & & Contains ( p ) )
return p ;
if ( p . x > Max . x ) p . x = Max . x ;
else if ( p . x < Min . x ) p . x = Min . x ;
if ( p . y > Max . y ) p . y = Max . y ;
else if ( p . y < Min . y ) p . y = Min . y ;
return p ;
}
} ;
// Stacked color modifier, backup of modified data so we can restore it
struct ImGuiColMod
{
2015-11-29 23:01:26 +01:00
ImGuiCol Col ;
2016-09-25 11:06:14 +02:00
ImVec4 BackupValue ;
2015-07-22 01:00:28 +02:00
} ;
2016-09-25 11:06:14 +02:00
// Stacked style modifier, backup of modified data so we can restore it. Data type inferred from the variable.
2015-07-22 01:00:28 +02:00
struct ImGuiStyleMod
{
2016-09-25 11:06:14 +02:00
ImGuiStyleVar VarIdx ;
union { int BackupInt [ 2 ] ; float BackupFloat [ 2 ] ; } ;
ImGuiStyleMod ( ImGuiStyleVar idx , int v ) { VarIdx = idx ; BackupInt [ 0 ] = v ; }
ImGuiStyleMod ( ImGuiStyleVar idx , float v ) { VarIdx = idx ; BackupFloat [ 0 ] = v ; }
ImGuiStyleMod ( ImGuiStyleVar idx , ImVec2 v ) { VarIdx = idx ; BackupFloat [ 0 ] = v . x ; BackupFloat [ 1 ] = v . y ; }
2015-07-22 01:00:28 +02:00
} ;
2015-07-31 07:48:59 +02:00
// Stacked data for BeginGroup()/EndGroup()
2015-07-22 01:00:28 +02:00
struct ImGuiGroupData
{
2015-11-29 23:01:26 +01:00
ImVec2 BackupCursorPos ;
ImVec2 BackupCursorMaxPos ;
float BackupIndentX ;
2016-09-13 09:18:17 +02:00
float BackupGroupOffsetX ;
2015-11-29 23:01:26 +01:00
float BackupCurrentLineHeight ;
float BackupCurrentLineTextBaseOffset ;
float BackupLogLinePosY ;
2016-09-25 14:18:10 +02:00
bool BackupActiveIdIsAlive ;
2015-11-29 23:01:26 +01:00
bool AdvanceCursor ;
2015-07-22 01:00:28 +02:00
} ;
2015-11-27 00:01:15 +01:00
// Per column data for Columns()
struct ImGuiColumnData
{
2016-10-30 00:44:08 +02:00
float OffsetNorm ; // Column start offset, normalized 0.0 (far left) -> 1.0 (far right)
2017-08-20 17:17:59 +02:00
ImRect ClipRect ;
2015-11-29 23:01:26 +01:00
//float IndentX;
2015-11-27 00:01:15 +01:00
} ;
2016-05-07 19:54:27 +02:00
// Simple column measurement currently used for MenuItem() only. This is very short-sighted/throw-away code and NOT a generic helper.
2015-09-10 11:22:17 +02:00
struct IMGUI_API ImGuiSimpleColumns
2015-07-22 01:00:28 +02:00
{
2015-11-29 23:01:26 +01:00
int Count ;
float Spacing ;
float Width , NextWidth ;
float Pos [ 8 ] , NextWidths [ 8 ] ;
2015-07-22 01:00:28 +02:00
ImGuiSimpleColumns ( ) ;
2016-05-07 19:54:27 +02:00
void Update ( int count , float spacing , bool clear ) ;
float DeclColumns ( float w0 , float w1 , float w2 ) ;
float CalcExtraSpace ( float avail_w ) ;
2015-07-22 01:00:28 +02:00
} ;
// Internal state of the currently focused/edited text input box
2015-09-10 11:22:17 +02:00
struct IMGUI_API ImGuiTextEditState
2015-07-22 01:00:28 +02:00
{
2015-10-18 16:50:46 +02:00
ImGuiID Id ; // widget id owning the text state
ImVector < ImWchar > Text ; // edit buffer, we need to persist but can't guarantee the persistence of the user-provided buffer. so we copy into own buffer.
ImVector < char > InitialText ; // backup of end-user buffer at the time of focus (in UTF-8, unaltered)
2015-07-22 01:00:28 +02:00
ImVector < char > TempTextBuffer ;
2015-10-18 16:50:46 +02:00
int CurLenA , CurLenW ; // we need to maintain our buffer length in both UTF-8 and wchar format.
int BufSizeA ; // end-user buffer size
2015-07-22 01:00:28 +02:00
float ScrollX ;
ImGuiStb : : STB_TexteditState StbState ;
float CursorAnim ;
bool CursorFollow ;
bool SelectedAllMouseLock ;
2015-10-18 16:50:46 +02:00
ImGuiTextEditState ( ) { memset ( this , 0 , sizeof ( * this ) ) ; }
void CursorAnimReset ( ) { CursorAnim = - 0.30f ; } // After a user-input the cursor stays on for a while without blinking
void CursorClamp ( ) { StbState . cursor = ImMin ( StbState . cursor , CurLenW ) ; StbState . select_start = ImMin ( StbState . select_start , CurLenW ) ; StbState . select_end = ImMin ( StbState . select_end , CurLenW ) ; }
bool HasSelection ( ) const { return StbState . select_start ! = StbState . select_end ; }
void ClearSelection ( ) { StbState . select_start = StbState . select_end = StbState . cursor ; }
void SelectAll ( ) { StbState . select_start = 0 ; StbState . select_end = CurLenW ; StbState . cursor = StbState . select_end ; StbState . has_preferred_x = false ; }
2015-07-22 01:00:28 +02:00
void OnKeyPressed ( int key ) ;
} ;
// Data saved in imgui.ini file
struct ImGuiIniData
{
2015-11-29 23:01:26 +01:00
char * Name ;
2016-06-12 22:27:15 +02:00
ImGuiID Id ;
2015-11-29 23:01:26 +01:00
ImVec2 Pos ;
ImVec2 Size ;
bool Collapsed ;
2015-07-22 01:00:28 +02:00
} ;
// Mouse cursor data (used when io.MouseDrawCursor is set)
struct ImGuiMouseCursorData
{
ImGuiMouseCursor Type ;
ImVec2 HotOffset ;
ImVec2 Size ;
ImVec2 TexUvMin [ 2 ] ;
ImVec2 TexUvMax [ 2 ] ;
} ;
// Storage for current popup stack
struct ImGuiPopupRef
{
2016-06-12 22:27:15 +02:00
ImGuiID PopupId ; // Set on OpenPopup()
2015-11-29 23:01:26 +01:00
ImGuiWindow * Window ; // Resolved on BeginPopup() - may stay unresolved if user never calls OpenPopup()
ImGuiWindow * ParentWindow ; // Set on OpenPopup()
ImGuiID ParentMenuSet ; // Set on OpenPopup()
2016-07-20 00:02:59 +02:00
ImVec2 PopupPosOnOpen ; // Preferred popup position (typically == MousePosOnOpen when using mouse)
2015-11-29 23:01:26 +01:00
ImVec2 MousePosOnOpen ; // Copy of mouse position at the time of opening popup
2015-07-22 01:00:28 +02:00
2016-07-20 00:02:59 +02:00
ImGuiPopupRef ( ImGuiID id , ImGuiWindow * parent_window , ImGuiID parent_menu_set , const ImVec2 & popup_pos , const ImVec2 & mouse_pos ) { PopupId = id ; Window = NULL ; ParentWindow = parent_window ; ParentMenuSet = parent_menu_set ; PopupPosOnOpen = popup_pos ; MousePosOnOpen = mouse_pos ; }
2015-07-22 01:00:28 +02:00
} ;
// Main state for ImGui
2016-05-07 19:55:51 +02:00
struct ImGuiContext
2015-07-22 01:00:28 +02:00
{
bool Initialized ;
ImGuiIO IO ;
ImGuiStyle Style ;
ImFont * Font ; // (Shortcut) == FontStack.empty() ? IO.Font : FontStack.back()
2016-07-18 13:03:47 +02:00
float FontSize ; // (Shortcut) == FontBaseSize * g.CurrentWindow->FontWindowScale == window->FontSize(). Text height for current window.
float FontBaseSize ; // (Shortcut) == IO.FontGlobalScale * Font->Scale * Font->FontSize. Base text height.
2016-03-21 22:11:43 +01:00
ImVec2 FontTexUvWhitePixel ; // (Shortcut) == Font->TexUvWhitePixel
2015-07-22 01:00:28 +02:00
float Time ;
int FrameCount ;
2015-09-17 00:48:42 +02:00
int FrameCountEnded ;
2015-07-22 01:00:28 +02:00
int FrameCountRendered ;
ImVector < ImGuiWindow * > Windows ;
ImVector < ImGuiWindow * > WindowsSortBuffer ;
ImVector < ImGuiWindow * > CurrentWindowStack ;
2017-11-07 13:59:55 +01:00
ImGuiStorage WindowsById ;
2016-07-18 13:03:47 +02:00
ImGuiWindow * CurrentWindow ; // Being drawn into
2015-07-22 01:00:28 +02:00
ImGuiWindow * HoveredWindow ; // Will catch mouse inputs
ImGuiWindow * HoveredRootWindow ; // Will catch mouse inputs (for focus/move only)
ImGuiID HoveredId ; // Hovered widget
2015-12-03 22:30:17 +01:00
bool HoveredIdAllowOverlap ;
2015-07-22 01:00:28 +02:00
ImGuiID HoveredIdPreviousFrame ;
2017-10-29 23:46:32 +01:00
float HoveredIdTimer ;
2015-07-22 01:00:28 +02:00
ImGuiID ActiveId ; // Active widget
ImGuiID ActiveIdPreviousFrame ;
2017-10-29 23:46:32 +01:00
float ActiveIdTimer ;
2016-07-17 14:26:01 +02:00
bool ActiveIdIsAlive ; // Active widget has been seen this frame
2015-07-22 01:00:28 +02:00
bool ActiveIdIsJustActivated ; // Set at the time of activation for one frame
2016-07-18 13:03:47 +02:00
bool ActiveIdAllowOverlap ; // Active widget allows another widget to steal active id (generally for overlapping widgets, but not always)
2016-07-30 14:31:34 +02:00
int ActiveIdAllowNavDirFlags ; // Active widget allows using directional navigation (e.g. can activate a button and move away from it)
2016-05-21 20:50:15 +02:00
ImVec2 ActiveIdClickOffset ; // Clicked offset from upper-left corner, if applicable (currently only set by ButtonBehavior)
2015-07-22 01:00:28 +02:00
ImGuiWindow * ActiveIdWindow ;
2016-07-20 00:02:59 +02:00
ImGuiInputSource ActiveIdSource ; // Activating with mouse or nav (gamepad/keyboard)
2017-10-27 12:01:52 +02:00
ImGuiWindow * MovingWindow ; // Track the child window we clicked on to move a window.
ImGuiID MovingWindowMoveId ; // == MovingWindow->MoveId
2015-07-22 01:00:28 +02:00
ImVector < ImGuiIniData > Settings ; // .ini Settings
2016-05-07 18:10:32 +02:00
float SettingsDirtyTimer ; // Save .ini Settings on disk when time reaches zero
2015-07-22 01:00:28 +02:00
ImVector < ImGuiColMod > ColorModifiers ; // Stack for PushStyleColor()/PopStyleColor()
ImVector < ImGuiStyleMod > StyleModifiers ; // Stack for PushStyleVar()/PopStyleVar()
ImVector < ImFont * > FontStack ; // Stack for PushFont()/PopFont()
2016-05-02 12:32:16 +02:00
ImVector < ImGuiPopupRef > OpenPopupStack ; // Which popups are open (persistent)
2015-07-22 01:00:28 +02:00
ImVector < ImGuiPopupRef > CurrentPopupStack ; // Which level of BeginPopup() we are in (reset every frame)
2016-07-20 00:02:59 +02:00
// Navigation data (for gamepad/keyboard)
2017-10-23 12:38:39 +02:00
ImGuiWindow * NavWindow ; // Focused window for navigation. Could be called 'FocusWindow'
2017-10-13 22:33:06 +02:00
ImGuiID NavId ; // Focused item for navigation
ImGuiID NavActivateId ; // ~~ IsNavInputPressed(ImGuiNavInput_PadActivate) ? NavId : 0, also set when calling ActivateItem()
ImGuiID NavActivateDownId ; // ~~ IsNavInputPressed(ImGuiNavInput_PadActivate) ? NavId : 0
ImGuiID NavInputId ; // ~~ IsNavInputPressed(ImGuiNavInput_PadInput) ? NavId : 0
2017-10-03 20:22:38 +02:00
ImGuiID NavJustTabbedId ; // Just tabbed to this id.
2017-10-06 06:25:20 +02:00
ImGuiID NavNextActivateId ; // Set by ActivateItem(), queued until next frame
2017-10-13 22:33:06 +02:00
ImGuiID NavJustMovedToId ; // Just navigated to this id (result of a successfully MoveRequest)
2017-09-29 19:26:03 +02:00
ImRect NavScoringRectScreen ; // Rectangle used for scoring, in screen space. Based of window->DC.NavRefRectRel[], modified for directional navigation scoring.
2016-07-20 00:02:59 +02:00
ImGuiWindow * NavWindowingTarget ;
2016-07-24 14:56:14 +02:00
float NavWindowingDisplayAlpha ;
bool NavWindowingToggleLayer ;
int NavLayer ; // Layer we are navigating on. For now the system is hard-coded for 0=main contents and 1=menu/title bar, may expose layers later.
2016-07-20 00:02:59 +02:00
int NavIdTabCounter ; // == NavWindow->DC.FocusIdxTabCounter at time of NavId processing
bool NavIdIsAlive ; // Nav widget has been seen this frame ~~ NavRefRectRel is valid
bool NavMousePosDirty ;
2016-08-20 23:27:25 +02:00
bool NavDisableHighlight ; // When user starts using mouse, we hide gamepad/keyboard highlight (nb: but they are still available, which is why NavDisableHighlight isn't always != NavDisableMouseHover)
bool NavDisableMouseHover ; // When user starts using gamepad/keyboard, we hide mouse hovering highlight until mouse is touched again.
2017-10-07 00:54:29 +02:00
bool NavAnyRequest ; // ~~ NavMoveRequest || NavInitRequest
bool NavInitRequest ; // Init request for appearing window to select first item
ImGuiID NavInitResultId ;
ImRect NavInitResultRectRel ;
bool NavInitResultExplicit ; // Whether the result was explicitly requested with SetItemDefaultFocus()
2016-07-30 17:18:34 +02:00
bool NavMoveFromClampedRefRect ; // Set by manual scrolling, if we scroll to a point where NavId isn't visible we reset navigation from visible items
2017-09-29 23:36:41 +02:00
bool NavMoveRequest ; // Move request for this frame
2017-10-05 19:29:17 +02:00
int NavMoveRequestForwardStep ; // 0: no forward, 1: forward request, 2: forward result (this is used to navigate sibling parent menus from a child menu)
ImGuiDir NavMoveDir ; // Direction of the move request (left/right/up/down)
ImGuiDir NavMoveDirLast ; // Direction of the previous move request
2016-07-24 12:46:25 +02:00
ImGuiID NavMoveResultId ; // Best move request candidate
2017-10-03 22:25:40 +02:00
ImGuiID NavMoveResultParentId ; //
2016-07-24 12:46:25 +02:00
float NavMoveResultDistBox ; // Best move request candidate box distance to current NavId
float NavMoveResultDistCenter ; // Best move request candidate center distance to current NavId
float NavMoveResultDistAxial ;
ImRect NavMoveResultRectRel ; // Best move request candidate bounding box in window relative space
2016-07-20 00:02:59 +02:00
2015-07-22 01:00:28 +02:00
// Storage for SetNexWindow** and SetNextTreeNode*** functions
ImVec2 SetNextWindowPosVal ;
2017-09-25 18:25:43 +02:00
ImVec2 SetNextWindowPosPivot ;
2015-07-22 01:00:28 +02:00
ImVec2 SetNextWindowSizeVal ;
2015-08-30 17:37:56 +02:00
ImVec2 SetNextWindowContentSizeVal ;
2015-07-22 01:00:28 +02:00
bool SetNextWindowCollapsedVal ;
2017-08-11 07:36:28 +02:00
ImGuiCond SetNextWindowPosCond ;
ImGuiCond SetNextWindowSizeCond ;
ImGuiCond SetNextWindowContentSizeCond ;
ImGuiCond SetNextWindowCollapsedCond ;
2016-05-21 22:53:08 +02:00
ImRect SetNextWindowSizeConstraintRect ; // Valid if 'SetNextWindowSizeConstraint' is true
ImGuiSizeConstraintCallback SetNextWindowSizeConstraintCallback ;
2017-08-11 07:36:28 +02:00
void * SetNextWindowSizeConstraintCallbackUserData ;
2016-05-21 22:53:08 +02:00
bool SetNextWindowSizeConstraint ;
2015-07-22 01:00:28 +02:00
bool SetNextWindowFocus ;
2016-05-02 12:32:16 +02:00
bool SetNextTreeNodeOpenVal ;
2017-08-11 07:36:28 +02:00
ImGuiCond SetNextTreeNodeOpenCond ;
2015-07-22 01:00:28 +02:00
// Render
2015-09-07 15:56:39 +02:00
ImDrawData RenderDrawData ; // Main ImDrawData instance to pass render information to the user
2015-07-22 01:00:28 +02:00
ImVector < ImDrawList * > RenderDrawLists [ 3 ] ;
float ModalWindowDarkeningRatio ;
ImDrawList OverlayDrawList ; // Optional software render of mouse cursors, if io.MouseDrawCursor is set + a few debug overlays
ImGuiMouseCursor MouseCursor ;
ImGuiMouseCursorData MouseCursorData [ ImGuiMouseCursor_Count_ ] ;
// Widget state
ImGuiTextEditState InputTextState ;
2015-11-19 23:09:59 +01:00
ImFont InputTextPasswordFont ;
2015-07-22 01:00:28 +02:00
ImGuiID ScalarAsInputTextId ; // Temporary text input when CTRL+clicking on a slider, etc.
2017-08-08 09:54:20 +02:00
ImGuiColorEditFlags ColorEditOptions ; // Store user options for color edit widgets
2017-07-29 09:54:45 +02:00
ImVec4 ColorPickerRef ;
2015-08-05 18:00:05 +02:00
float DragCurrentValue ; // Currently dragged value, always float, not rounded by end-user precision settings
2015-07-22 01:00:28 +02:00
ImVec2 DragLastMouseDelta ;
2015-08-05 18:00:05 +02:00
float DragSpeedDefaultRatio ; // If speed == 0.0f, uses (max-min) * DragSpeedDefaultRatio
2015-07-22 01:00:28 +02:00
float DragSpeedScaleSlow ;
float DragSpeedScaleFast ;
2016-05-07 18:10:32 +02:00
ImVec2 ScrollbarClickDeltaToGrabCenter ; // Distance between mouse and center of grab box, normalized in parent space. Use storage?
2017-07-20 20:21:48 +02:00
int TooltipOverrideCount ;
2016-07-30 10:02:46 +02:00
ImVector < char > PrivateClipboard ; // If no custom clipboard handler is defined
2015-11-29 15:15:07 +01:00
ImVec2 OsImePosRequest , OsImePosSet ; // Cursor position request & last passed to the OS Input Method Editor
2015-07-22 01:00:28 +02:00
// Logging
bool LogEnabled ;
2015-08-24 13:50:18 +02:00
FILE * LogFile ; // If != NULL log to stdout/ file
2015-08-05 18:00:05 +02:00
ImGuiTextBuffer * LogClipboard ; // Else log to clipboard. This is pointer so our GImGui static constructor doesn't call heap allocators.
2015-07-22 01:00:28 +02:00
int LogStartDepth ;
int LogAutoExpandMaxDepth ;
// Misc
float FramerateSecPerFrame [ 120 ] ; // calculate estimate of framerate for user
int FramerateSecPerFrameIdx ;
float FramerateSecPerFrameAccum ;
2017-09-06 17:20:54 +02:00
int WantCaptureMouseNextFrame ; // explicit capture via CaptureInputs() sets those flags
int WantCaptureKeyboardNextFrame ;
2017-09-06 17:25:36 +02:00
int WantTextInputNextFrame ;
2015-07-22 01:00:28 +02:00
char TempBuffer [ 1024 * 3 + 1 ] ; // temporary text buffer
2016-05-07 19:55:51 +02:00
ImGuiContext ( )
2015-07-22 01:00:28 +02:00
{
Initialized = false ;
Font = NULL ;
FontSize = FontBaseSize = 0.0f ;
FontTexUvWhitePixel = ImVec2 ( 0.0f , 0.0f ) ;
Time = 0.0f ;
FrameCount = 0 ;
2015-09-17 00:48:42 +02:00
FrameCountEnded = FrameCountRendered = - 1 ;
2015-07-22 01:00:28 +02:00
CurrentWindow = NULL ;
HoveredWindow = NULL ;
HoveredRootWindow = NULL ;
HoveredId = 0 ;
2015-12-03 22:30:17 +01:00
HoveredIdAllowOverlap = false ;
2015-07-22 01:00:28 +02:00
HoveredIdPreviousFrame = 0 ;
2017-10-29 23:46:32 +01:00
HoveredIdTimer = 0.0f ;
2015-07-22 01:00:28 +02:00
ActiveId = 0 ;
ActiveIdPreviousFrame = 0 ;
2017-10-29 23:46:32 +01:00
ActiveIdTimer = 0.0f ;
2015-07-22 01:00:28 +02:00
ActiveIdIsAlive = false ;
ActiveIdIsJustActivated = false ;
2015-12-03 22:30:17 +01:00
ActiveIdAllowOverlap = false ;
2017-10-06 01:39:59 +02:00
ActiveIdAllowNavDirFlags = 0 ;
2016-05-21 20:50:15 +02:00
ActiveIdClickOffset = ImVec2 ( - 1 , - 1 ) ;
2015-07-22 01:00:28 +02:00
ActiveIdWindow = NULL ;
2016-07-20 00:02:59 +02:00
ActiveIdSource = ImGuiInputSource_None ;
2017-10-27 12:01:52 +02:00
MovingWindow = NULL ;
MovingWindowMoveId = 0 ;
2015-07-22 01:00:28 +02:00
SettingsDirtyTimer = 0.0f ;
2016-07-31 13:38:57 +02:00
NavWindow = NULL ;
2017-10-06 05:35:47 +02:00
NavId = NavActivateId = NavActivateDownId = NavInputId = 0 ;
2017-10-13 22:33:06 +02:00
NavJustTabbedId = NavJustMovedToId = NavNextActivateId = 0 ;
2017-09-29 19:26:03 +02:00
NavScoringRectScreen = ImRect ( ) ;
2016-07-20 00:02:59 +02:00
NavWindowingTarget = NULL ;
2016-07-24 14:56:14 +02:00
NavWindowingDisplayAlpha = 0.0f ;
NavWindowingToggleLayer = false ;
2017-10-06 01:39:59 +02:00
NavLayer = 0 ;
2016-07-20 00:02:59 +02:00
NavIdTabCounter = INT_MAX ;
NavIdIsAlive = false ;
NavMousePosDirty = false ;
NavDisableHighlight = true ;
NavDisableMouseHover = false ;
2017-10-07 00:14:28 +02:00
NavAnyRequest = false ;
2017-10-07 00:54:29 +02:00
NavInitRequest = false ;
NavInitResultId = 0 ;
NavInitResultExplicit = false ;
2017-09-29 22:56:51 +02:00
NavMoveFromClampedRefRect = false ;
2016-07-20 00:02:59 +02:00
NavMoveRequest = false ;
2017-09-29 23:36:41 +02:00
NavMoveRequestForwardStep = 0 ;
2017-09-28 23:48:30 +02:00
NavMoveDir = NavMoveDirLast = ImGuiDir_None ;
2016-07-24 12:46:25 +02:00
NavMoveResultId = 0 ;
2017-10-03 22:25:40 +02:00
NavMoveResultParentId = 0 ;
2016-07-24 12:46:25 +02:00
NavMoveResultDistBox = NavMoveResultDistCenter = NavMoveResultDistAxial = 0.0f ;
2016-07-20 00:02:59 +02:00
2015-07-22 01:00:28 +02:00
SetNextWindowPosVal = ImVec2 ( 0.0f , 0.0f ) ;
SetNextWindowSizeVal = ImVec2 ( 0.0f , 0.0f ) ;
SetNextWindowCollapsedVal = false ;
SetNextWindowPosCond = 0 ;
SetNextWindowSizeCond = 0 ;
2015-12-30 11:45:13 +01:00
SetNextWindowContentSizeCond = 0 ;
2015-07-22 01:00:28 +02:00
SetNextWindowCollapsedCond = 0 ;
2016-11-12 21:17:30 +01:00
SetNextWindowSizeConstraintRect = ImRect ( ) ;
2016-05-21 22:53:08 +02:00
SetNextWindowSizeConstraintCallback = NULL ;
SetNextWindowSizeConstraintCallbackUserData = NULL ;
2016-11-12 21:17:30 +01:00
SetNextWindowSizeConstraint = false ;
SetNextWindowFocus = false ;
2016-05-02 12:32:16 +02:00
SetNextTreeNodeOpenVal = false ;
SetNextTreeNodeOpenCond = 0 ;
2015-07-22 01:00:28 +02:00
ScalarAsInputTextId = 0 ;
2017-08-08 09:54:20 +02:00
ColorEditOptions = ImGuiColorEditFlags__OptionsDefault ;
2015-07-22 01:00:28 +02:00
DragCurrentValue = 0.0f ;
DragLastMouseDelta = ImVec2 ( 0.0f , 0.0f ) ;
2016-06-25 17:03:49 +02:00
DragSpeedDefaultRatio = 1.0f / 100.0f ;
2016-07-16 10:46:51 +02:00
DragSpeedScaleSlow = 1.0f / 100.0f ;
2015-07-22 01:00:28 +02:00
DragSpeedScaleFast = 10.0f ;
2015-08-30 17:37:56 +02:00
ScrollbarClickDeltaToGrabCenter = ImVec2 ( 0.0f , 0.0f ) ;
2017-07-20 20:21:48 +02:00
TooltipOverrideCount = 0 ;
2015-11-29 15:15:07 +01:00
OsImePosRequest = OsImePosSet = ImVec2 ( - 1.0f , - 1.0f ) ;
2015-07-22 01:00:28 +02:00
ModalWindowDarkeningRatio = 0.0f ;
OverlayDrawList . _OwnerName = " ##Overlay " ; // Give it a name for debugging
MouseCursor = ImGuiMouseCursor_Arrow ;
2015-12-30 11:45:13 +01:00
memset ( MouseCursorData , 0 , sizeof ( MouseCursorData ) ) ;
2015-07-22 01:00:28 +02:00
LogEnabled = false ;
LogFile = NULL ;
LogClipboard = NULL ;
LogStartDepth = 0 ;
LogAutoExpandMaxDepth = 2 ;
memset ( FramerateSecPerFrame , 0 , sizeof ( FramerateSecPerFrame ) ) ;
FramerateSecPerFrameIdx = 0 ;
FramerateSecPerFrameAccum = 0.0f ;
2017-09-06 17:25:36 +02:00
WantCaptureMouseNextFrame = WantCaptureKeyboardNextFrame = WantTextInputNextFrame = - 1 ;
2015-12-30 11:45:13 +01:00
memset ( TempBuffer , 0 , sizeof ( TempBuffer ) ) ;
2015-07-22 01:00:28 +02:00
}
} ;
2016-08-07 20:05:24 +02:00
// Transient per-window flags, reset at the beginning of the frame. For child window, inherited from parent on first Begin().
enum ImGuiItemFlags_
{
2017-09-06 20:36:36 +02:00
ImGuiItemFlags_AllowKeyboardFocus = 1 < < 0 , // true
ImGuiItemFlags_ButtonRepeat = 1 < < 1 , // false // Button() will return true multiple times based on io.KeyRepeatDelay and io.KeyRepeatRate settings.
2017-10-25 09:28:54 +02:00
ImGuiItemFlags_Disabled = 1 < < 2 , // false // FIXME-WIP: Disable interactions but doesn't affect visuals. Should be: grey out and disable interactions with widgets that affect data + view widgets (WIP)
2017-09-28 19:58:01 +02:00
ImGuiItemFlags_NoNav = 1 < < 3 , // false
ImGuiItemFlags_NoNavDefaultFocus = 1 < < 4 , // false
ImGuiItemFlags_SelectableDontClosePopup = 1 < < 5 , // false // MenuItem/Selectable() automatically closes current Popup window
2017-09-28 19:18:41 +02:00
ImGuiItemFlags_Default_ = ImGuiItemFlags_AllowKeyboardFocus
2016-08-07 20:05:24 +02:00
} ;
2015-07-22 01:00:28 +02:00
// Transient per-window data, reset at the beginning of the frame
// FIXME: That's theory, in practice the delimitation between ImGuiWindow and ImGuiDrawContext is quite tenuous and could be reconsidered.
2015-09-22 00:53:51 +02:00
struct IMGUI_API ImGuiDrawContext
2015-07-22 01:00:28 +02:00
{
ImVec2 CursorPos ;
ImVec2 CursorPosPrevLine ;
ImVec2 CursorStartPos ;
ImVec2 CursorMaxPos ; // Implicitly calculate the size of our contents, always extending. Saved into window->SizeContents at the end of the frame
float CurrentLineHeight ;
float CurrentLineTextBaseOffset ;
float PrevLineHeight ;
float PrevLineTextBaseOffset ;
float LogLinePosY ;
int TreeDepth ;
2016-06-12 22:27:15 +02:00
ImGuiID LastItemId ;
2015-07-22 01:00:28 +02:00
ImRect LastItemRect ;
2017-09-28 15:43:26 +02:00
bool LastItemRectHoveredRect ;
2017-09-29 23:36:41 +02:00
bool NavHasScroll ; // Set when scrolling can be used (ScrollMax > 0.0f)
int NavLayerCurrent ; // Current layer, 0..31 (we currently only use 0..1)
2017-10-06 23:51:15 +02:00
int NavLayerCurrentMask ; // = (1 << NavLayerCurrent) used by ItemAdd prior to clipping.
2017-09-29 22:57:44 +02:00
int NavLayerActiveMask ; // Which layer have been written to (result from previous frame)
int NavLayerActiveMaskNext ; // Which layer have been written to (buffer for current frame)
bool MenuBarAppending ; // FIXME: Remove this
2015-07-22 01:00:28 +02:00
float MenuBarOffsetX ;
ImVector < ImGuiWindow * > ChildWindows ;
ImGuiStorage * StateStorage ;
ImGuiLayoutType LayoutType ;
2017-09-29 23:36:41 +02:00
ImGuiLayoutType ParentLayoutType ; // Layout type of parent window at the time of Begin()
2015-07-22 01:00:28 +02:00
// We store the current settings outside of the vectors to increase memory locality (reduce cache misses). The vectors are rarely modified. Also it allows us to not heap allocate for short-lived windows which are not using those settings.
2016-08-07 20:05:24 +02:00
ImGuiItemFlags ItemFlags ; // == ItemFlagsStack.back() [empty == ImGuiItemFlags_Default]
2015-07-22 01:00:28 +02:00
float ItemWidth ; // == ItemWidthStack.back(). 0.0: default, >0.0: width in pixels, <0.0: align xx pixels to the right of window
float TextWrapPos ; // == TextWrapPosStack.back() [empty == -1.0f]
2016-08-07 20:05:24 +02:00
ImVector < ImGuiItemFlags > ItemFlagsStack ;
2015-07-22 01:00:28 +02:00
ImVector < float > ItemWidthStack ;
ImVector < float > TextWrapPosStack ;
ImVector < ImGuiGroupData > GroupStack ;
int StackSizesBackup [ 6 ] ; // Store size of various stacks for asserting
2015-11-26 23:43:21 +01:00
float IndentX ; // Indentation / start position from left of window (increased by TreePush/TreePop, etc.)
2016-07-30 23:41:44 +02:00
float GroupOffsetX ;
2015-07-22 01:00:28 +02:00
float ColumnsOffsetX ; // Offset to the current column (if ColumnsCurrent > 0). FIXME: This and the above should be a stack to allow use cases like Tree->Column->Tree. Need revamp columns API.
int ColumnsCurrent ;
int ColumnsCount ;
2015-11-28 17:36:25 +01:00
float ColumnsMinX ;
float ColumnsMaxX ;
2015-11-28 13:14:50 +01:00
float ColumnsStartPosY ;
2017-08-20 14:37:04 +02:00
float ColumnsStartMaxPosX ; // Backup of CursorMaxPos
2015-07-22 01:00:28 +02:00
float ColumnsCellMinY ;
float ColumnsCellMaxY ;
2017-08-20 12:44:48 +02:00
ImGuiColumnsFlags ColumnsFlags ;
2016-06-12 22:27:15 +02:00
ImGuiID ColumnsSetId ;
2015-11-27 00:01:15 +01:00
ImVector < ImGuiColumnData > ColumnsData ;
2015-07-22 01:00:28 +02:00
ImGuiDrawContext ( )
{
CursorPos = CursorPosPrevLine = CursorStartPos = CursorMaxPos = ImVec2 ( 0.0f , 0.0f ) ;
CurrentLineHeight = PrevLineHeight = 0.0f ;
CurrentLineTextBaseOffset = PrevLineTextBaseOffset = 0.0f ;
LogLinePosY = - 1.0f ;
TreeDepth = 0 ;
2016-06-12 22:27:15 +02:00
LastItemId = 0 ;
2017-09-28 15:43:26 +02:00
LastItemRect = ImRect ( ) ;
LastItemRectHoveredRect = false ;
2016-07-24 14:56:14 +02:00
NavHasScroll = false ;
2017-09-28 19:41:30 +02:00
NavLayerActiveMask = NavLayerActiveMaskNext = 0x00 ;
2016-07-24 14:56:14 +02:00
NavLayerCurrent = 0 ;
2017-10-06 23:51:15 +02:00
NavLayerCurrentMask = 1 < < 0 ;
2015-07-22 01:00:28 +02:00
MenuBarAppending = false ;
MenuBarOffsetX = 0.0f ;
StateStorage = NULL ;
2017-09-29 23:36:41 +02:00
LayoutType = ParentLayoutType = ImGuiLayoutType_Vertical ;
2015-07-22 01:00:28 +02:00
ItemWidth = 0.0f ;
2016-08-07 20:05:24 +02:00
ItemFlags = ImGuiItemFlags_Default_ ;
2015-07-22 01:00:28 +02:00
TextWrapPos = - 1.0f ;
memset ( StackSizesBackup , 0 , sizeof ( StackSizesBackup ) ) ;
2015-11-26 23:43:21 +01:00
IndentX = 0.0f ;
2016-11-12 21:17:30 +01:00
GroupOffsetX = 0.0f ;
2015-07-22 01:00:28 +02:00
ColumnsOffsetX = 0.0f ;
ColumnsCurrent = 0 ;
ColumnsCount = 1 ;
2015-11-28 17:36:25 +01:00
ColumnsMinX = ColumnsMaxX = 0.0f ;
2015-11-28 13:14:50 +01:00
ColumnsStartPosY = 0.0f ;
2017-08-20 14:37:04 +02:00
ColumnsStartMaxPosX = 0.0f ;
2015-07-22 01:00:28 +02:00
ColumnsCellMinY = ColumnsCellMaxY = 0.0f ;
2016-10-30 00:44:08 +02:00
ColumnsFlags = 0 ;
2016-06-12 22:27:15 +02:00
ColumnsSetId = 0 ;
2015-07-22 01:00:28 +02:00
}
} ;
2015-07-31 07:48:59 +02:00
// Windows data
2015-09-10 11:22:17 +02:00
struct IMGUI_API ImGuiWindow
2015-07-22 01:00:28 +02:00
{
char * Name ;
2016-04-19 18:31:40 +02:00
ImGuiID ID ; // == ImHash(Name)
ImGuiWindowFlags Flags ; // See enum ImGuiWindowFlags_
2017-07-20 15:25:31 +02:00
int OrderWithinParent ; // Order within immediate parent window, if we are a child window. Otherwise 0.
2015-07-22 01:00:28 +02:00
ImVec2 PosFloat ;
ImVec2 Pos ; // Position rounded-up to nearest pixel
ImVec2 Size ; // Current size (==SizeFull or collapsed title bar size)
ImVec2 SizeFull ; // Size when non collapsed
ImVec2 SizeContents ; // Size of contents (== extents reach of the drawing cursor) from previous frame
2015-08-30 17:37:56 +02:00
ImVec2 SizeContentsExplicit ; // Size of contents explicitly set by the user via SetNextWindowContentSize()
2016-05-29 17:50:23 +02:00
ImRect ContentsRegionRect ; // Maximum visible content position in window coordinates. ~~ (SizeContentsExplicit ? SizeContentsExplicit : Size - ScrollbarSizes) - CursorStartPos, per axis
2017-11-18 19:02:02 +01:00
ImVec2 WindowPadding ; // Window padding at the time of begin.
float WindowRounding ; // Window rounding at the time of begin.
float WindowBorderSize ; // Window border size at the time of begin.
2016-06-12 22:27:15 +02:00
ImGuiID MoveId ; // == window->GetID("#MOVE")
2017-08-22 13:26:21 +02:00
ImGuiID ChildId ; // Id of corresponding item in parent window (for child windows)
2015-08-30 16:08:13 +02:00
ImVec2 Scroll ;
2015-08-30 19:33:38 +02:00
ImVec2 ScrollTarget ; // target scroll position. stored as cursor position with scrolling canceled out, so the highest point is always 0.0f. (FLT_MAX for no change)
ImVec2 ScrollTargetCenterRatio ; // 0.0f = scroll so that target position is at top, 0.5f = scroll so that target position is centered
2015-08-30 17:37:56 +02:00
bool ScrollbarX , ScrollbarY ;
2016-01-24 12:00:37 +01:00
ImVec2 ScrollbarSizes ;
2015-07-22 01:00:28 +02:00
bool Active ; // Set to true on Begin()
bool WasActive ;
2017-11-19 00:07:38 +01:00
bool WriteAccessed ; // Set to true when any widget access the current window
2015-07-22 01:00:28 +02:00
bool Collapsed ; // Set when collapsing window to become only title-bar
2016-07-30 10:56:52 +02:00
bool CollapseToggleWanted ;
2017-09-01 21:55:59 +02:00
bool SkipItems ; // Set when items can safely be all clipped (e.g. window not visible or collapsed)
bool Appearing ; // Set during the frame where the window is appearing (or re-appearing)
2017-11-13 23:25:13 +01:00
bool CloseButton ; // Set when the window has a close button (p_open != NULL)
2015-07-22 01:00:28 +02:00
int BeginCount ; // Number of Begin() during the current frame (generally 0 or 1, 1+ if appending via multiple Begin/End pairs)
2016-06-12 22:27:15 +02:00
ImGuiID PopupId ; // ID in the popup stack when this window is used as a popup/menu (because we use generic Name/ID for recycling)
2015-07-22 01:00:28 +02:00
int AutoFitFramesX , AutoFitFramesY ;
bool AutoFitOnlyGrows ;
2016-07-31 13:05:13 +02:00
int AutoFitChildAxises ;
2015-07-22 01:00:28 +02:00
int AutoPosLastDirection ;
int HiddenFrames ;
2017-08-11 07:36:28 +02:00
ImGuiCond SetWindowPosAllowFlags ; // store condition flags for next SetWindowPos() call.
ImGuiCond SetWindowSizeAllowFlags ; // store condition flags for next SetWindowSize() call.
ImGuiCond SetWindowCollapsedAllowFlags ; // store condition flags for next SetWindowCollapsed() call.
2017-09-25 18:25:43 +02:00
ImVec2 SetWindowPosVal ; // store window position when using a non-zero Pivot (position set needs to be processed when we know the window size)
ImVec2 SetWindowPosPivot ; // store window pivot for positioning. ImVec2(0,0) when positioning from top-left corner; ImVec2(0.5f,0.5f) for centering; ImVec2(1,1) for bottom right.
2015-07-22 01:00:28 +02:00
2017-09-29 19:26:03 +02:00
ImGuiID NavLastIds [ 2 ] ; // Last known NavId for this window, per layer (0/1)
2017-09-29 19:28:19 +02:00
ImRect NavRectRel [ 2 ] ; // Reference rectangle, in window space
2017-09-29 17:58:25 +02:00
2015-07-22 01:00:28 +02:00
ImGuiDrawContext DC ; // Temporary per-window data, reset at the beginning of the frame
ImVector < ImGuiID > IDStack ; // ID stack. ID are hashes seeded with the value at the top of the stack
2015-08-06 16:23:05 +02:00
ImRect ClipRect ; // = DrawList->clip_rect_stack.back(). Scissoring / clipping rectangle. x1, y1, x2, y2.
2016-05-06 11:31:32 +02:00
ImRect WindowRectClipped ; // = WindowRect just after setup in Begin(). == window->Rect() for root window.
2016-07-20 00:02:59 +02:00
ImRect InnerRect ;
2015-10-18 17:57:10 +02:00
int LastFrameActive ;
2015-07-22 01:00:28 +02:00
float ItemWidthDefault ;
ImGuiSimpleColumns MenuColumns ; // Simplified columns storage for menu items
ImGuiStorage StateStorage ;
float FontWindowScale ; // Scale multiplier per-window
ImDrawList * DrawList ;
2016-07-17 14:26:01 +02:00
ImGuiWindow * ParentWindow ; // Immediate parent in the window stack *regardless* of whether this window is a child window or not)
2016-07-31 12:55:23 +02:00
ImGuiWindow * RootWindow ; // Generally point to ourself. If we are a child window, this is pointing to the first non-child parent window.
ImGuiWindow * RootNonPopupWindow ; // Generally point to ourself. Used to display TitleBgActive color and for selecting which window to use for NavWindowing
ImGuiWindow * RootNavWindow ; // Generally point to ourself. If we are a child window with the ImGuiWindowFlags_NavFlattenedChild flag, point to parent. Used to display TitleBgActive color and for selecting which window to use for NavWindowing.
2015-07-22 01:00:28 +02:00
2016-06-25 17:03:49 +02:00
// Navigation / Focus
2016-07-20 00:02:59 +02:00
// FIXME-NAVIGATION: Merge all this with the new Nav system, at least the request variables should be moved to ImGuiContext
2015-07-22 01:00:28 +02:00
int FocusIdxAllCounter ; // Start at -1 and increase as assigned via FocusItemRegister()
int FocusIdxTabCounter ; // (same, but only count widgets which you can Tab through)
int FocusIdxAllRequestCurrent ; // Item being requested for focus
int FocusIdxTabRequestCurrent ; // Tab-able item being requested for focus
int FocusIdxAllRequestNext ; // Item being requested for focus, for next update (relies on layout to be stable between the frame pressing TAB and the next frame)
int FocusIdxTabRequestNext ; // "
public :
ImGuiWindow ( const char * name ) ;
~ ImGuiWindow ( ) ;
ImGuiID GetID ( const char * str , const char * str_end = NULL ) ;
ImGuiID GetID ( const void * ptr ) ;
2016-07-13 01:18:59 +02:00
ImGuiID GetIDNoKeepAlive ( const char * str , const char * str_end = NULL ) ;
2015-07-22 01:00:28 +02:00
2017-11-22 12:26:50 +01:00
// We don't use g.FontSize because the window may be != g.CurrentWidow.
2015-07-22 01:00:28 +02:00
ImRect Rect ( ) const { return ImRect ( Pos . x , Pos . y , Pos . x + Size . x , Pos . y + Size . y ) ; }
float CalcFontSize ( ) const { return GImGui - > FontBaseSize * FontWindowScale ; }
float TitleBarHeight ( ) const { return ( Flags & ImGuiWindowFlags_NoTitleBar ) ? 0.0f : CalcFontSize ( ) + GImGui - > Style . FramePadding . y * 2.0f ; }
ImRect TitleBarRect ( ) const { return ImRect ( Pos , ImVec2 ( Pos . x + SizeFull . x , Pos . y + TitleBarHeight ( ) ) ) ; }
float MenuBarHeight ( ) const { return ( Flags & ImGuiWindowFlags_MenuBar ) ? CalcFontSize ( ) + GImGui - > Style . FramePadding . y * 2.0f : 0.0f ; }
ImRect MenuBarRect ( ) const { float y1 = Pos . y + TitleBarHeight ( ) ; return ImRect ( Pos . x , y1 , Pos . x + SizeFull . x , y1 + MenuBarHeight ( ) ) ; }
} ;
2015-08-02 05:57:24 +02:00
2017-10-18 19:51:32 +02:00
// Backup and restore just enough data to be able to use IsItemHovered() on item A after another B in the same window has overwritten the data.
struct ImGuiItemHoveredDataBackup
{
ImGuiID LastItemId ;
ImRect LastItemRect ;
bool LastItemRectHoveredRect ;
void Backup ( ) { ImGuiWindow * window = GImGui - > CurrentWindow ; LastItemId = window - > DC . LastItemId ; LastItemRect = window - > DC . LastItemRect ; LastItemRectHoveredRect = window - > DC . LastItemRectHoveredRect ; }
void Restore ( ) { ImGuiWindow * window = GImGui - > CurrentWindow ; window - > DC . LastItemId = LastItemId ; window - > DC . LastItemRect = LastItemRect ; window - > DC . LastItemRectHoveredRect = LastItemRectHoveredRect ; }
} ;
2015-08-02 05:57:24 +02:00
//-----------------------------------------------------------------------------
// Internal API
// No guarantee of forward compatibility here.
//-----------------------------------------------------------------------------
namespace ImGui
{
2015-09-17 00:48:42 +02:00
// We should always have a CurrentWindow in the stack (there is an implicit "Debug" window)
// If this ever crash because g.CurrentWindow is NULL it means that either
// - ImGui::NewFrame() has never been called, which is illegal.
// - You are calling ImGui functions after ImGui::Render() and before the next ImGui::NewFrame(), which is also illegal.
2016-05-07 19:55:51 +02:00
inline ImGuiWindow * GetCurrentWindowRead ( ) { ImGuiContext & g = * GImGui ; return g . CurrentWindow ; }
2017-11-19 00:07:38 +01:00
inline ImGuiWindow * GetCurrentWindow ( ) { ImGuiContext & g = * GImGui ; g . CurrentWindow - > WriteAccessed = true ; return g . CurrentWindow ; }
2015-08-06 16:11:33 +02:00
IMGUI_API ImGuiWindow * GetParentWindow ( ) ;
2016-02-20 17:37:36 +01:00
IMGUI_API ImGuiWindow * FindWindowByName ( const char * name ) ;
2015-08-06 16:11:33 +02:00
IMGUI_API void FocusWindow ( ImGuiWindow * window ) ;
2017-11-16 13:11:16 +01:00
IMGUI_API void BringWindowToFront ( ImGuiWindow * window ) ;
IMGUI_API void BringWindowToBack ( ImGuiWindow * window ) ;
2015-08-06 16:11:33 +02:00
2017-08-26 10:35:39 +02:00
IMGUI_API void Initialize ( ) ;
2016-04-03 00:47:41 +02:00
2015-08-06 16:11:33 +02:00
IMGUI_API void SetActiveID ( ImGuiID id , ImGuiWindow * window ) ;
2017-10-13 16:48:14 +02:00
IMGUI_API ImGuiID GetActiveID ( ) ;
2017-10-13 13:23:21 +02:00
IMGUI_API void SetFocusID ( ImGuiID id , ImGuiWindow * window ) ;
2017-08-20 18:03:37 +02:00
IMGUI_API void ClearActiveID ( ) ;
2015-10-06 19:27:24 +02:00
IMGUI_API void SetHoveredID ( ImGuiID id ) ;
2017-10-13 16:48:14 +02:00
IMGUI_API ImGuiID GetHoveredID ( ) ;
2015-08-06 16:11:33 +02:00
IMGUI_API void KeepAliveID ( ImGuiID id ) ;
2015-08-02 05:57:24 +02:00
IMGUI_API void ItemSize ( const ImVec2 & size , float text_offset_y = 0.0f ) ;
IMGUI_API void ItemSize ( const ImRect & bb , float text_offset_y = 0.0f ) ;
2017-10-06 23:27:29 +02:00
IMGUI_API bool ItemAdd ( const ImRect & bb , ImGuiID id , const ImRect * nav_bb = NULL ) ;
2017-09-28 00:21:47 +02:00
IMGUI_API bool ItemHoverable ( const ImRect & bb , ImGuiID id ) ;
2017-10-06 23:23:18 +02:00
IMGUI_API bool IsClippedEx ( const ImRect & bb , ImGuiID id , bool clip_even_when_logged ) ;
2016-07-20 00:02:59 +02:00
IMGUI_API bool FocusableItemRegister ( ImGuiWindow * window , ImGuiID id , bool tab_stop = true ) ; // Return true if focus is requested
2015-08-02 05:57:24 +02:00
IMGUI_API void FocusableItemUnregister ( ImGuiWindow * window ) ;
IMGUI_API ImVec2 CalcItemSize ( ImVec2 size , float default_x , float default_y ) ;
IMGUI_API float CalcWrapWidthForPos ( const ImVec2 & pos , float wrap_pos_x ) ;
2017-09-25 22:45:10 +02:00
IMGUI_API void PushMultiItemsWidths ( int components , float width_full = 0.0f ) ;
2016-08-07 20:05:24 +02:00
IMGUI_API void PushItemFlag ( ImGuiItemFlags option , bool enabled ) ;
IMGUI_API void PopItemFlag ( ) ;
2015-08-02 05:57:24 +02:00
2017-08-16 09:47:10 +02:00
IMGUI_API void OpenPopupEx ( ImGuiID id , bool reopen_existing ) ;
2017-09-25 12:52:06 +02:00
IMGUI_API void ClosePopup ( ImGuiID id ) ;
2017-08-16 07:42:41 +02:00
IMGUI_API bool IsPopupOpen ( ImGuiID id ) ;
2017-09-25 12:52:06 +02:00
IMGUI_API bool BeginPopupEx ( ImGuiID id , ImGuiWindowFlags extra_flags ) ;
2017-10-27 16:21:12 +02:00
IMGUI_API void BeginTooltipEx ( ImGuiWindowFlags extra_flags , bool override_previous_tooltip = true ) ;
2015-12-20 23:39:47 +01:00
2017-11-24 16:50:11 +01:00
IMGUI_API void NavInitWindow ( ImGuiWindow * window , bool force_reinit ) ;
2016-08-03 23:23:04 +02:00
IMGUI_API int CalcTypematicPressedRepeatAmount ( float t , float t_prev , float repeat_delay , float repeat_rate ) ;
2016-07-20 00:02:59 +02:00
2017-10-13 13:29:42 +02:00
IMGUI_API void Scrollbar ( ImGuiLayoutType direction ) ;
2017-09-28 16:41:01 +02:00
IMGUI_API void VerticalSeparator ( ) ; // Vertical separator, for menu bars (use current line height). not exposed because it is misleading what it doesn't have an effect on regular layout.
2017-11-20 19:39:27 +01:00
IMGUI_API bool SplitterBehavior ( ImGuiID id , const ImRect & bb , ImGuiAxis axis , float * size1 , float * size2 , float min_size1 , float min_size2 , float hover_extend = 0.0f ) ;
2017-09-28 16:41:01 +02:00
2017-09-01 22:10:13 +02:00
// FIXME-WIP: New Columns API
2017-08-20 12:44:48 +02:00
IMGUI_API void BeginColumns ( const char * id , int count , ImGuiColumnsFlags flags = 0 ) ; // setup number of columns. use an identifier to distinguish multiple column sets. close with EndColumns().
IMGUI_API void EndColumns ( ) ; // close columns
2017-08-20 17:09:43 +02:00
IMGUI_API void PushColumnClipRect ( int column_index = - 1 ) ;
2017-08-20 12:44:48 +02:00
2017-09-01 22:10:13 +02:00
// FIXME-WIP: New Combo API
2017-09-25 21:45:34 +02:00
IMGUI_API bool BeginCombo ( const char * label , const char * preview_value , ImVec2 popup_size = ImVec2 ( 0.0f , 0.0f ) ) ;
2017-09-01 22:10:13 +02:00
IMGUI_API void EndCombo ( ) ;
2017-07-30 10:16:06 +02:00
// NB: All position are in absolute pixels coordinates (never using window coordinates internally)
// AVOID USING OUTSIDE OF IMGUI.CPP! NOT FOR PUBLIC CONSUMPTION. THOSE FUNCTIONS ARE A MESS. THEIR SIGNATURE AND BEHAVIOR WILL CHANGE, THEY NEED TO BE REFACTORED INTO SOMETHING DECENT.
2015-08-02 05:57:24 +02:00
IMGUI_API void RenderText ( ImVec2 pos , const char * text , const char * text_end = NULL , bool hide_text_after_hash = true ) ;
IMGUI_API void RenderTextWrapped ( ImVec2 pos , const char * text , const char * text_end , float wrap_width ) ;
2016-09-25 12:53:13 +02:00
IMGUI_API void RenderTextClipped ( const ImVec2 & pos_min , const ImVec2 & pos_max , const char * text , const char * text_end , const ImVec2 * text_size_if_known , const ImVec2 & align = ImVec2 ( 0 , 0 ) , const ImRect * clip_rect = NULL ) ;
2015-08-02 05:57:24 +02:00
IMGUI_API void RenderFrame ( ImVec2 p_min , ImVec2 p_max , ImU32 fill_col , bool border = true , float rounding = 0.0f ) ;
2017-07-22 13:37:13 +02:00
IMGUI_API void RenderFrameBorder ( ImVec2 p_min , ImVec2 p_max , float rounding = 0.0f ) ;
2017-07-27 10:26:32 +02:00
IMGUI_API void RenderColorRectWithAlphaCheckerboard ( ImVec2 p_min , ImVec2 p_max , ImU32 fill_col , float grid_step , ImVec2 grid_off , float rounding = 0.0f , int rounding_corners_flags = ~ 0 ) ;
2017-10-18 23:46:16 +02:00
IMGUI_API void RenderTriangle ( ImVec2 pos , ImGuiDir dir , float scale = 1.0f ) ;
2016-05-01 20:19:28 +02:00
IMGUI_API void RenderBullet ( ImVec2 pos ) ;
2017-10-18 13:06:49 +02:00
IMGUI_API void RenderCheckMark ( ImVec2 pos , ImU32 col , float sz ) ;
2017-10-03 22:54:19 +02:00
IMGUI_API void RenderNavHighlight ( const ImRect & bb , ImGuiID id , ImGuiNavHighlightFlags flags = ImGuiNavHighlightFlags_TypeDefault ) ; // Navigation highlight
2017-08-29 09:22:30 +02:00
IMGUI_API void RenderRectFilledRangeH ( ImDrawList * draw_list , const ImRect & rect , ImU32 col , float x_start_norm , float x_end_norm , float rounding ) ;
2016-03-21 20:40:02 +01:00
IMGUI_API const char * FindRenderedTextEnd ( const char * text , const char * text_end = NULL ) ; // Find the optional ## from which we stop displaying text.
2015-08-02 05:57:24 +02:00
2015-10-30 11:36:51 +01:00
IMGUI_API bool ButtonBehavior ( const ImRect & bb , ImGuiID id , bool * out_hovered , bool * out_held , ImGuiButtonFlags flags = 0 ) ;
2015-08-02 05:57:24 +02:00
IMGUI_API bool ButtonEx ( const char * label , const ImVec2 & size_arg = ImVec2 ( 0 , 0 ) , ImGuiButtonFlags flags = 0 ) ;
2016-04-21 09:55:02 +02:00
IMGUI_API bool CloseButton ( ImGuiID id , const ImVec2 & pos , float radius ) ;
2017-11-11 16:58:43 +01:00
IMGUI_API bool ArrowButton ( ImGuiID id , ImGuiDir dir , ImVec2 padding , ImGuiButtonFlags flags = 0 ) ;
2015-08-02 05:57:24 +02:00
2015-10-30 11:43:23 +01:00
IMGUI_API bool SliderBehavior ( const ImRect & frame_bb , ImGuiID id , float * v , float v_min , float v_max , float power , int decimal_precision , ImGuiSliderFlags flags = 0 ) ;
2015-08-02 05:57:24 +02:00
IMGUI_API bool SliderFloatN ( const char * label , float * v , int components , float v_min , float v_max , const char * display_format , float power ) ;
IMGUI_API bool SliderIntN ( const char * label , int * v , int components , int v_min , int v_max , const char * display_format ) ;
IMGUI_API bool DragBehavior ( const ImRect & frame_bb , ImGuiID id , float * v , float v_speed , float v_min , float v_max , int decimal_precision , float power ) ;
IMGUI_API bool DragFloatN ( const char * label , float * v , int components , float v_speed , float v_min , float v_max , const char * display_format , float power ) ;
IMGUI_API bool DragIntN ( const char * label , int * v , int components , float v_speed , int v_min , int v_max , const char * display_format ) ;
IMGUI_API bool InputTextEx ( const char * label , char * buf , int buf_size , const ImVec2 & size_arg , ImGuiInputTextFlags flags , ImGuiTextEditCallback callback = NULL , void * user_data = NULL ) ;
IMGUI_API bool InputFloatN ( const char * label , float * v , int components , int decimal_precision , ImGuiInputTextFlags extra_flags ) ;
IMGUI_API bool InputIntN ( const char * label , int * v , int components , ImGuiInputTextFlags extra_flags ) ;
2015-08-06 00:57:31 +02:00
IMGUI_API bool InputScalarEx ( const char * label , ImGuiDataType data_type , void * data_ptr , void * step_ptr , void * step_fast_ptr , const char * scalar_format , ImGuiInputTextFlags extra_flags ) ;
IMGUI_API bool InputScalarAsWidgetReplacement ( const ImRect & aabb , const char * label , ImGuiDataType data_type , void * data_ptr , ImGuiID id , int decimal_precision ) ;
2015-08-02 05:57:24 +02:00
2017-09-27 11:39:13 +02:00
IMGUI_API void ColorTooltip ( const char * text , const float * col , ImGuiColorEditFlags flags ) ;
IMGUI_API void ColorEditOptionsPopup ( const float * col , ImGuiColorEditFlags flags ) ;
2017-07-22 12:01:16 +02:00
2016-05-01 14:34:55 +02:00
IMGUI_API bool TreeNodeBehavior ( ImGuiID id , ImGuiTreeNodeFlags flags , const char * label , const char * label_end = NULL ) ;
2016-05-02 12:32:16 +02:00
IMGUI_API bool TreeNodeBehaviorIsOpen ( ImGuiID id , ImGuiTreeNodeFlags flags = 0 ) ; // Consume previous SetNextTreeNodeOpened() data, if any. May return true when logging
2016-05-01 14:34:55 +02:00
IMGUI_API void TreePushRawID ( ImGuiID id ) ;
2015-08-29 19:13:30 +02:00
2015-08-02 05:57:24 +02:00
IMGUI_API void PlotEx ( ImGuiPlotType plot_type , const char * label , float ( * values_getter ) ( void * data , int idx ) , void * data , int values_count , int values_offset , const char * overlay_text , float scale_min , float scale_max , ImVec2 graph_size ) ;
IMGUI_API int ParseFormatPrecision ( const char * fmt , int default_value ) ;
IMGUI_API float RoundScalar ( float value , int decimal_precision ) ;
2017-10-19 19:33:03 +02:00
// Shade functions
IMGUI_API void ShadeVertsLinearColorGradientKeepAlpha ( ImDrawVert * vert_start , ImDrawVert * vert_end , ImVec2 gradient_p0 , ImVec2 gradient_p1 , ImU32 col0 , ImU32 col1 ) ;
IMGUI_API void ShadeVertsLinearAlphaGradientForLeftToRightText ( ImDrawVert * vert_start , ImDrawVert * vert_end , float gradient_p0_x , float gradient_p1_x ) ;
2017-11-19 21:00:38 +01:00
IMGUI_API void ShadeVertsLinearUV ( ImDrawVert * vert_start , ImDrawVert * vert_end , const ImVec2 & a , const ImVec2 & b , const ImVec2 & uv_a , const ImVec2 & uv_b , bool clamp ) ;
2017-10-19 19:33:03 +02:00
2016-05-29 19:14:19 +02:00
} // namespace ImGui
2017-08-17 15:13:14 +02:00
// ImFontAtlas internals
2017-08-17 15:19:54 +02:00
IMGUI_API bool ImFontAtlasBuildWithStbTruetype ( ImFontAtlas * atlas ) ;
2017-08-17 14:44:44 +02:00
IMGUI_API void ImFontAtlasBuildRegisterDefaultCustomRects ( ImFontAtlas * atlas ) ;
2017-08-17 15:13:14 +02:00
IMGUI_API void ImFontAtlasBuildSetupFont ( ImFontAtlas * atlas , ImFont * font , ImFontConfig * font_config , float ascent , float descent ) ;
2017-08-17 14:44:44 +02:00
IMGUI_API void ImFontAtlasBuildPackCustomRects ( ImFontAtlas * atlas , void * spc ) ;
2017-09-26 19:26:16 +02:00
IMGUI_API void ImFontAtlasBuildFinish ( ImFontAtlas * atlas ) ;
2017-08-26 08:11:56 +02:00
IMGUI_API void ImFontAtlasBuildMultiplyCalcLookupTable ( unsigned char out_table [ 256 ] , float in_multiply_factor ) ;
IMGUI_API void ImFontAtlasBuildMultiplyRectAlpha8 ( const unsigned char table [ 256 ] , unsigned char * pixels , int x , int y , int w , int h , int stride ) ;
2017-08-17 14:44:44 +02:00
2016-05-29 19:14:19 +02:00
# ifdef __clang__
# pragma clang diagnostic pop
# endif
2015-08-02 05:57:24 +02:00
2015-09-22 00:53:51 +02:00
# ifdef _MSC_VER
# pragma warning (pop)
# endif