2021-12-31 01:10:06 +01:00
# include <hex/ui/imgui_imhex_extensions.h>
2021-01-27 00:00:20 +01:00
# include <imgui.h>
# define IMGUI_DEFINE_MATH_OPERATORS
# include <imgui_internal.h>
# undef IMGUI_DEFINE_MATH_OPERATORS
2021-04-17 15:46:26 +02:00
# define STB_IMAGE_IMPLEMENTATION
# include <stb_image.h>
2021-01-27 12:04:42 +01:00
# include <string>
2021-08-21 15:03:44 +02:00
# include <imgui_impl_opengl3_loader.h>
2021-04-17 15:46:26 +02:00
2022-08-17 16:15:36 +02:00
# include <hex/api/imhex_api.hpp>
2021-01-27 00:00:20 +01:00
namespace ImGui {
2022-10-13 15:13:53 +02:00
Texture : : Texture ( const ImU8 * buffer , int size , int width , int height ) {
2022-09-18 20:38:45 +02:00
unsigned char * imageData = stbi_load_from_memory ( buffer , size , & this - > m_width , & this - > m_height , nullptr , 4 ) ;
2022-10-13 15:13:53 +02:00
if ( imageData = = nullptr ) {
if ( width * height * 4 > size )
return ;
imageData = ( unsigned char * ) STBI_MALLOC ( size ) ;
std : : memcpy ( imageData , buffer , size ) ;
this - > m_width = width ;
this - > m_height = height ;
}
2022-09-18 20:38:45 +02:00
if ( imageData = = nullptr )
return ;
GLuint texture ;
glGenTextures ( 1 , & texture ) ;
glBindTexture ( GL_TEXTURE_2D , texture ) ;
glTexParameteri ( GL_TEXTURE_2D , GL_TEXTURE_MIN_FILTER , GL_NEAREST ) ;
glTexParameteri ( GL_TEXTURE_2D , GL_TEXTURE_MAG_FILTER , GL_NEAREST ) ;
# if defined(GL_UNPACK_ROW_LENGTH)
glPixelStorei ( GL_UNPACK_ROW_LENGTH , 0 ) ;
# endif
glTexImage2D ( GL_TEXTURE_2D , 0 , GL_RGBA , this - > m_width , this - > m_height , 0 , GL_RGBA , GL_UNSIGNED_BYTE , imageData ) ;
stbi_image_free ( imageData ) ;
this - > m_textureId = reinterpret_cast < ImTextureID > ( static_cast < intptr_t > ( texture ) ) ;
}
Texture : : Texture ( const char * path ) {
unsigned char * imageData = stbi_load ( path , & this - > m_width , & this - > m_height , nullptr , 4 ) ;
if ( imageData = = nullptr )
return ;
GLuint texture ;
glGenTextures ( 1 , & texture ) ;
glBindTexture ( GL_TEXTURE_2D , texture ) ;
glTexParameteri ( GL_TEXTURE_2D , GL_TEXTURE_MIN_FILTER , GL_LINEAR ) ;
glTexParameteri ( GL_TEXTURE_2D , GL_TEXTURE_MAG_FILTER , GL_LINEAR ) ;
# if defined(GL_UNPACK_ROW_LENGTH)
glPixelStorei ( GL_UNPACK_ROW_LENGTH , 0 ) ;
# endif
glTexImage2D ( GL_TEXTURE_2D , 0 , GL_RGBA , this - > m_width , this - > m_height , 0 , GL_RGBA , GL_UNSIGNED_BYTE , imageData ) ;
stbi_image_free ( imageData ) ;
this - > m_textureId = reinterpret_cast < ImTextureID > ( static_cast < intptr_t > ( texture ) ) ;
}
2023-01-20 21:16:28 +01:00
Texture : : Texture ( unsigned int texture , int width , int height ) : m_textureId ( reinterpret_cast < ImTextureID > ( static_cast < intptr_t > ( texture ) ) ) , m_width ( width ) , m_height ( height ) {
}
2022-09-18 20:38:45 +02:00
Texture : : Texture ( Texture & & other ) noexcept {
2023-01-20 21:16:28 +01:00
glDeleteTextures ( 1 , reinterpret_cast < GLuint * > ( & this - > m_textureId ) ) ;
2022-09-18 20:38:45 +02:00
this - > m_textureId = other . m_textureId ;
this - > m_width = other . m_width ;
this - > m_height = other . m_height ;
other . m_textureId = nullptr ;
}
2022-10-02 17:30:26 +02:00
Texture & Texture : : operator = ( Texture & & other ) noexcept {
2023-01-20 21:16:28 +01:00
glDeleteTextures ( 1 , reinterpret_cast < GLuint * > ( & this - > m_textureId ) ) ;
2022-09-18 20:38:45 +02:00
this - > m_textureId = other . m_textureId ;
this - > m_width = other . m_width ;
this - > m_height = other . m_height ;
other . m_textureId = nullptr ;
2022-10-02 17:30:26 +02:00
return * this ;
2022-09-18 20:38:45 +02:00
}
Texture : : ~ Texture ( ) {
if ( this - > m_textureId = = nullptr )
return ;
auto glTextureId = static_cast < GLuint > ( reinterpret_cast < intptr_t > ( this - > m_textureId ) ) ;
glDeleteTextures ( 1 , & glTextureId ) ;
}
2021-12-07 22:47:41 +01:00
int UpdateStringSizeCallback ( ImGuiInputTextCallbackData * data ) {
2022-03-01 16:12:00 +01:00
if ( data - > EventFlag = = ImGuiInputTextFlags_CallbackResize ) {
auto & string = * static_cast < std : : string * > ( data - > UserData ) ;
2022-05-30 16:36:46 +02:00
string . resize ( data - > BufTextLen ) ;
2022-03-01 16:12:00 +01:00
data - > Buf = string . data ( ) ;
}
2021-12-07 22:47:41 +01:00
return 0 ;
}
2022-01-24 20:53:17 +01:00
bool IconHyperlink ( const char * icon , const char * label , const ImVec2 & size_arg , ImGuiButtonFlags flags ) {
ImGuiWindow * window = GetCurrentWindow ( ) ;
2021-08-04 14:01:24 +02:00
if ( window - > SkipItems )
return false ;
2022-02-01 22:09:44 +01:00
ImGuiContext & g = * GImGui ;
const ImGuiID id = window - > GetID ( label ) ;
2022-10-02 17:30:26 +02:00
ImVec2 label_size = CalcTextSize ( icon , nullptr , false ) ;
label_size . x + = CalcTextSize ( " " , nullptr , false ) . x + CalcTextSize ( label , nullptr , false ) . x ;
2021-08-04 14:01:24 +02:00
2022-02-01 22:09:44 +01:00
ImVec2 pos = window - > DC . CursorPos ;
2021-08-04 14:01:24 +02:00
ImVec2 size = CalcItemSize ( size_arg , label_size . x , label_size . y ) ;
const ImRect bb ( pos , pos + size ) ;
if ( ! ItemAdd ( bb , id ) )
return false ;
2021-08-21 00:51:50 +02:00
if ( g . LastItemData . InFlags & ImGuiItemFlags_ButtonRepeat )
2021-08-04 14:01:24 +02:00
flags | = ImGuiButtonFlags_Repeat ;
bool hovered , held ;
bool pressed = ButtonBehavior ( bb , id , & hovered , & held , flags ) ;
// Render
const ImU32 col = hovered ? GetColorU32 ( ImGuiCol_ButtonHovered ) : GetColorU32 ( ImGuiCol_ButtonActive ) ;
PushStyleColor ( ImGuiCol_Text , ImU32 ( col ) ) ;
Text ( " %s %s " , icon , label ) ;
GetWindowDrawList ( ) - > AddLine ( ImVec2 ( pos . x , pos . y + size . y ) , pos + size , ImU32 ( col ) ) ;
PopStyleColor ( ) ;
IMGUI_TEST_ENGINE_ITEM_INFO ( id , label , window - > DC . LastItemStatusFlags ) ;
return pressed ;
}
2022-01-24 20:53:17 +01:00
bool Hyperlink ( const char * label , const ImVec2 & size_arg , ImGuiButtonFlags flags ) {
ImGuiWindow * window = GetCurrentWindow ( ) ;
2021-01-27 00:00:20 +01:00
if ( window - > SkipItems )
return false ;
2022-02-01 22:09:44 +01:00
ImGuiContext & g = * GImGui ;
const ImGuiID id = window - > GetID ( label ) ;
2022-10-02 17:30:26 +02:00
const ImVec2 label_size = CalcTextSize ( label , nullptr , true ) ;
2021-01-27 00:00:20 +01:00
2022-02-01 22:09:44 +01:00
ImVec2 pos = window - > DC . CursorPos ;
2021-01-27 00:00:20 +01:00
ImVec2 size = CalcItemSize ( size_arg , label_size . x , label_size . y ) ;
const ImRect bb ( pos , pos + size ) ;
if ( ! ItemAdd ( bb , id ) )
return false ;
2021-08-21 00:51:50 +02:00
if ( g . LastItemData . InFlags & ImGuiItemFlags_ButtonRepeat )
2021-01-27 00:00:20 +01:00
flags | = ImGuiButtonFlags_Repeat ;
bool hovered , held ;
bool pressed = ButtonBehavior ( bb , id , & hovered , & held , flags ) ;
// Render
2021-01-27 12:04:42 +01:00
const ImU32 col = hovered ? GetColorU32 ( ImGuiCol_ButtonHovered ) : GetColorU32 ( ImGuiCol_ButtonActive ) ;
2021-01-27 00:00:20 +01:00
PushStyleColor ( ImGuiCol_Text , ImU32 ( col ) ) ;
2022-10-02 17:30:26 +02:00
TextEx ( label , nullptr , ImGuiTextFlags_NoWidthForLargeClippedText ) ; // Skip formatting
2021-01-27 14:26:24 +01:00
GetWindowDrawList ( ) - > AddLine ( ImVec2 ( pos . x , pos . y + size . y ) , pos + size , ImU32 ( col ) ) ;
2021-01-27 00:00:20 +01:00
PopStyleColor ( ) ;
IMGUI_TEST_ENGINE_ITEM_INFO ( id , label , window - > DC . LastItemStatusFlags ) ;
return pressed ;
}
2022-01-24 20:53:17 +01:00
bool BulletHyperlink ( const char * label , const ImVec2 & size_arg , ImGuiButtonFlags flags ) {
ImGuiWindow * window = GetCurrentWindow ( ) ;
2021-01-27 12:04:42 +01:00
if ( window - > SkipItems )
return false ;
2022-02-01 22:09:44 +01:00
ImGuiContext & g = * GImGui ;
2022-01-24 20:53:17 +01:00
const ImGuiStyle & style = g . Style ;
2022-02-01 22:09:44 +01:00
const ImGuiID id = window - > GetID ( label ) ;
2022-10-02 17:30:26 +02:00
const ImVec2 label_size = CalcTextSize ( label , nullptr , true ) ;
2021-01-27 12:04:42 +01:00
2022-02-01 22:09:44 +01:00
ImVec2 pos = window - > DC . CursorPos ;
2021-01-30 23:02:03 +01:00
ImVec2 size = CalcItemSize ( size_arg , label_size . x , label_size . y ) + ImVec2 ( g . FontSize + style . FramePadding . x * 2 , 0.0f ) ;
2021-01-27 12:04:42 +01:00
const ImRect bb ( pos , pos + size ) ;
2022-03-04 19:06:29 +01:00
ItemSize ( size , 0 ) ;
2021-01-27 12:04:42 +01:00
if ( ! ItemAdd ( bb , id ) )
return false ;
2021-08-21 00:51:50 +02:00
if ( g . LastItemData . InFlags & ImGuiItemFlags_ButtonRepeat )
2021-01-27 12:04:42 +01:00
flags | = ImGuiButtonFlags_Repeat ;
bool hovered , held ;
bool pressed = ButtonBehavior ( bb , id , & hovered , & held , flags ) ;
// Render
const ImU32 col = hovered ? GetColorU32 ( ImGuiCol_ButtonHovered ) : GetColorU32 ( ImGuiCol_ButtonActive ) ;
PushStyleColor ( ImGuiCol_Text , ImU32 ( col ) ) ;
2022-03-04 19:06:29 +01:00
RenderBullet ( window - > DrawList , bb . Min + ImVec2 ( style . FramePadding . x , g . FontSize * 0.5f ) , col ) ;
RenderText ( bb . Min + ImVec2 ( g . FontSize * 0.5 + style . FramePadding . x , 0.0f ) , label , nullptr , false ) ;
GetWindowDrawList ( ) - > AddLine ( bb . Min + ImVec2 ( g . FontSize * 0.5 + style . FramePadding . x , size . y ) , pos + size - ImVec2 ( g . FontSize * 0.5 + style . FramePadding . x , 0 ) , ImU32 ( col ) ) ;
2021-01-27 12:04:42 +01:00
PopStyleColor ( ) ;
IMGUI_TEST_ENGINE_ITEM_INFO ( id , label , window - > DC . LastItemStatusFlags ) ;
return pressed ;
}
2022-01-24 20:53:17 +01:00
bool DescriptionButton ( const char * label , const char * description , const ImVec2 & size_arg , ImGuiButtonFlags flags ) {
ImGuiWindow * window = GetCurrentWindow ( ) ;
2021-01-27 12:04:42 +01:00
if ( window - > SkipItems )
return false ;
2022-02-01 22:09:44 +01:00
ImGuiContext & g = * GImGui ;
2022-01-24 20:53:17 +01:00
const ImGuiStyle & style = g . Style ;
2022-02-01 22:09:44 +01:00
const ImGuiID id = window - > GetID ( label ) ;
2022-10-02 17:30:26 +02:00
const ImVec2 text_size = CalcTextSize ( ( std : : string ( label ) + " \n " + std : : string ( description ) ) . c_str ( ) , nullptr , true ) ;
const ImVec2 label_size = CalcTextSize ( label , nullptr , true ) ;
2021-01-27 12:04:42 +01:00
ImVec2 pos = window - > DC . CursorPos ;
2022-01-24 20:53:17 +01:00
if ( ( flags & ImGuiButtonFlags_AlignTextBaseLine ) & & style . FramePadding . y < window - > DC . CurrLineTextBaseOffset ) // Try to vertically align buttons that are smaller/have no padding so that text baseline matches (bit hacky, since it shouldn't be a flag)
2021-01-27 12:04:42 +01:00
pos . y + = window - > DC . CurrLineTextBaseOffset - style . FramePadding . y ;
ImVec2 size = CalcItemSize ( size_arg , text_size . x + style . FramePadding . x * 4.0f , text_size . y + style . FramePadding . y * 4.0f ) ;
const ImRect bb ( pos , pos + size ) ;
ItemSize ( size , style . FramePadding . y ) ;
if ( ! ItemAdd ( bb , id ) )
return false ;
2021-08-21 00:51:50 +02:00
if ( g . LastItemData . InFlags & ImGuiItemFlags_ButtonRepeat )
2021-01-27 12:04:42 +01:00
flags | = ImGuiButtonFlags_Repeat ;
bool hovered , held ;
bool pressed = ButtonBehavior ( bb , id , & hovered , & held , flags ) ;
ImGui : : PushStyleVar ( ImGuiStyleVar_ButtonTextAlign , ImVec2 ( 0.0 , 0.5 ) ) ;
// Render
2022-01-24 20:53:17 +01:00
const ImU32 col = GetCustomColorU32 ( ( held & & hovered ) ? ImGuiCustomCol_DescButtonActive : hovered ? ImGuiCustomCol_DescButtonHovered
: ImGuiCustomCol_DescButton ) ;
2021-01-27 12:04:42 +01:00
RenderNavHighlight ( bb , id ) ;
RenderFrame ( bb . Min , bb . Max , col , true , style . FrameRounding ) ;
PushStyleColor ( ImGuiCol_Text , GetColorU32 ( ImGuiCol_ButtonActive ) ) ;
2021-02-25 00:17:41 +01:00
RenderTextWrapped ( bb . Min + style . FramePadding * 2 , label , nullptr , CalcWrapWidthForPos ( window - > DC . CursorPos , window - > DC . TextWrapPos ) ) ;
2021-01-27 12:04:42 +01:00
PopStyleColor ( ) ;
PushStyleColor ( ImGuiCol_Text , GetColorU32 ( ImGuiCol_Text ) ) ;
2022-10-02 17:30:26 +02:00
RenderTextClipped ( bb . Min + style . FramePadding * 2 + ImVec2 ( style . FramePadding . x * 2 , label_size . y ) , bb . Max - style . FramePadding , description , nullptr , & text_size , style . ButtonTextAlign , & bb ) ;
2021-01-27 12:04:42 +01:00
PopStyleColor ( ) ;
ImGui : : PopStyleVar ( ) ;
// Automatically close popups
2022-01-24 20:53:17 +01:00
// if (pressed && !(flags & ImGuiButtonFlags_DontClosePopups) && (window->Flags & ImGuiWindowFlags_Popup))
2021-01-27 12:04:42 +01:00
// CloseCurrentPopup();
IMGUI_TEST_ENGINE_ITEM_INFO ( id , label , window - > DC . LastItemStatusFlags ) ;
return pressed ;
}
2022-01-24 20:53:17 +01:00
void UnderlinedText ( const char * label , ImColor color , const ImVec2 & size_arg ) {
ImGuiWindow * window = GetCurrentWindow ( ) ;
2021-01-27 12:04:42 +01:00
2022-10-02 17:30:26 +02:00
const ImVec2 label_size = CalcTextSize ( label , nullptr , true ) ;
2021-01-27 12:04:42 +01:00
2022-02-01 22:09:44 +01:00
ImVec2 pos = window - > DC . CursorPos ;
2021-01-27 12:04:42 +01:00
ImVec2 size = CalcItemSize ( size_arg , label_size . x , label_size . y ) ;
PushStyleColor ( ImGuiCol_Text , ImU32 ( color ) ) ;
2022-10-02 17:30:26 +02:00
TextEx ( label , nullptr , ImGuiTextFlags_NoWidthForLargeClippedText ) ; // Skip formatting
2021-01-27 14:26:24 +01:00
GetWindowDrawList ( ) - > AddLine ( ImVec2 ( pos . x , pos . y + size . y ) , pos + size , ImU32 ( color ) ) ;
2021-01-27 12:04:42 +01:00
PopStyleColor ( ) ;
}
2022-01-24 20:53:17 +01:00
void TextSpinner ( const char * label ) {
2021-02-22 13:06:53 +01:00
ImGui : : Text ( " [%c] %s " , " |/- \\ " [ ImU32 ( ImGui : : GetTime ( ) * 20 ) % 4 ] , label ) ;
}
2021-03-02 13:49:45 +01:00
void Header ( const char * label , bool firstEntry ) {
if ( ! firstEntry )
ImGui : : NewLine ( ) ;
ImGui : : TextUnformatted ( label ) ;
ImGui : : Separator ( ) ;
}
2021-08-28 16:02:53 +02:00
void HeaderColored ( const char * label , ImColor color , bool firstEntry ) {
if ( ! firstEntry )
ImGui : : NewLine ( ) ;
2022-01-15 14:14:53 +01:00
ImGui : : TextFormattedColored ( color , " {} " , label ) ;
2021-08-28 16:02:53 +02:00
ImGui : : Separator ( ) ;
}
2021-08-18 23:12:27 +02:00
void InfoTooltip ( const char * text ) {
2021-08-21 00:51:50 +02:00
static double lastMoveTime ;
static ImGuiID lastHoveredID ;
2022-02-01 22:09:44 +01:00
double currTime = ImGui : : GetTime ( ) ;
2021-08-21 00:51:50 +02:00
ImGuiID hoveredID = ImGui : : GetHoveredID ( ) ;
if ( IsItemHovered ( ) & & ( currTime - lastMoveTime ) > = 0.5 & & hoveredID = = lastHoveredID ) {
2021-08-18 23:12:27 +02:00
BeginTooltip ( ) ;
TextUnformatted ( text ) ;
EndTooltip ( ) ;
}
2021-08-21 00:51:50 +02:00
if ( hoveredID ! = lastHoveredID ) {
lastMoveTime = currTime ;
}
lastHoveredID = hoveredID ;
2021-08-18 23:12:27 +02:00
}
2021-02-25 00:17:41 +01:00
ImU32 GetCustomColorU32 ( ImGuiCustomCol idx , float alpha_mul ) {
2022-01-24 20:53:17 +01:00
auto & customData = * static_cast < ImHexCustomData * > ( GImGui - > IO . UserData ) ;
2022-02-01 22:09:44 +01:00
ImVec4 c = customData . Colors [ idx ] ;
2021-02-25 00:17:41 +01:00
c . w * = GImGui - > Style . Alpha * alpha_mul ;
return ColorConvertFloat4ToU32 ( c ) ;
}
2021-08-21 00:51:50 +02:00
ImVec4 GetCustomColorVec4 ( ImGuiCustomCol idx , float alpha_mul ) {
2022-01-24 20:53:17 +01:00
auto & customData = * static_cast < ImHexCustomData * > ( GImGui - > IO . UserData ) ;
2022-02-01 22:09:44 +01:00
ImVec4 c = customData . Colors [ idx ] ;
2021-08-21 00:51:50 +02:00
c . w * = GImGui - > Style . Alpha * alpha_mul ;
return c ;
}
2021-02-25 00:17:41 +01:00
void StyleCustomColorsDark ( ) {
2022-01-24 20:53:17 +01:00
auto & colors = static_cast < ImHexCustomData * > ( GImGui - > IO . UserData ) - > Colors ;
2021-02-25 00:17:41 +01:00
2022-02-01 22:09:44 +01:00
colors [ ImGuiCustomCol_DescButton ] = ImColor ( 20 , 20 , 20 ) ;
2022-01-24 20:53:17 +01:00
colors [ ImGuiCustomCol_DescButtonHovered ] = ImColor ( 40 , 40 , 40 ) ;
2022-02-01 22:09:44 +01:00
colors [ ImGuiCustomCol_DescButtonActive ] = ImColor ( 60 , 60 , 60 ) ;
2021-08-21 00:51:50 +02:00
2022-02-01 22:09:44 +01:00
colors [ ImGuiCustomCol_ToolbarGray ] = ImColor ( 230 , 230 , 230 ) ;
colors [ ImGuiCustomCol_ToolbarRed ] = ImColor ( 231 , 76 , 60 ) ;
2022-01-24 20:53:17 +01:00
colors [ ImGuiCustomCol_ToolbarYellow ] = ImColor ( 241 , 196 , 15 ) ;
2022-02-01 22:09:44 +01:00
colors [ ImGuiCustomCol_ToolbarGreen ] = ImColor ( 56 , 139 , 66 ) ;
colors [ ImGuiCustomCol_ToolbarBlue ] = ImColor ( 6 , 83 , 155 ) ;
2022-01-24 20:53:17 +01:00
colors [ ImGuiCustomCol_ToolbarPurple ] = ImColor ( 103 , 42 , 120 ) ;
2022-02-01 22:09:44 +01:00
colors [ ImGuiCustomCol_ToolbarBrown ] = ImColor ( 219 , 179 , 119 ) ;
2021-08-28 16:02:53 +02:00
2022-01-24 20:53:17 +01:00
colors [ ImGuiCustomCol_Highlight ] = ImColor ( 77 , 198 , 155 ) ;
2021-02-25 00:17:41 +01:00
}
void StyleCustomColorsLight ( ) {
2022-01-24 20:53:17 +01:00
auto & colors = static_cast < ImHexCustomData * > ( GImGui - > IO . UserData ) - > Colors ;
2021-02-25 00:17:41 +01:00
2022-02-01 22:09:44 +01:00
colors [ ImGuiCustomCol_DescButton ] = ImColor ( 230 , 230 , 230 ) ;
2022-01-24 20:53:17 +01:00
colors [ ImGuiCustomCol_DescButtonHovered ] = ImColor ( 210 , 210 , 210 ) ;
2022-02-01 22:09:44 +01:00
colors [ ImGuiCustomCol_DescButtonActive ] = ImColor ( 190 , 190 , 190 ) ;
2021-08-21 00:51:50 +02:00
2022-02-01 22:09:44 +01:00
colors [ ImGuiCustomCol_ToolbarGray ] = ImColor ( 25 , 25 , 25 ) ;
colors [ ImGuiCustomCol_ToolbarRed ] = ImColor ( 231 , 76 , 60 ) ;
2022-01-24 20:53:17 +01:00
colors [ ImGuiCustomCol_ToolbarYellow ] = ImColor ( 241 , 196 , 15 ) ;
2022-02-01 22:09:44 +01:00
colors [ ImGuiCustomCol_ToolbarGreen ] = ImColor ( 56 , 139 , 66 ) ;
colors [ ImGuiCustomCol_ToolbarBlue ] = ImColor ( 6 , 83 , 155 ) ;
2022-01-24 20:53:17 +01:00
colors [ ImGuiCustomCol_ToolbarPurple ] = ImColor ( 103 , 42 , 120 ) ;
2022-02-01 22:09:44 +01:00
colors [ ImGuiCustomCol_ToolbarBrown ] = ImColor ( 219 , 179 , 119 ) ;
2021-08-28 16:02:53 +02:00
2022-01-24 20:53:17 +01:00
colors [ ImGuiCustomCol_Highlight ] = ImColor ( 41 , 151 , 112 ) ;
2021-02-25 00:17:41 +01:00
}
void StyleCustomColorsClassic ( ) {
2022-01-24 20:53:17 +01:00
auto & colors = static_cast < ImHexCustomData * > ( GImGui - > IO . UserData ) - > Colors ;
2021-02-25 00:17:41 +01:00
2022-02-01 22:09:44 +01:00
colors [ ImGuiCustomCol_DescButton ] = ImColor ( 40 , 40 , 80 ) ;
2022-01-24 20:53:17 +01:00
colors [ ImGuiCustomCol_DescButtonHovered ] = ImColor ( 60 , 60 , 100 ) ;
2022-02-01 22:09:44 +01:00
colors [ ImGuiCustomCol_DescButtonActive ] = ImColor ( 80 , 80 , 120 ) ;
2021-08-21 00:51:50 +02:00
2022-02-01 22:09:44 +01:00
colors [ ImGuiCustomCol_ToolbarGray ] = ImColor ( 230 , 230 , 230 ) ;
colors [ ImGuiCustomCol_ToolbarRed ] = ImColor ( 231 , 76 , 60 ) ;
2022-01-24 20:53:17 +01:00
colors [ ImGuiCustomCol_ToolbarYellow ] = ImColor ( 241 , 196 , 15 ) ;
2022-02-01 22:09:44 +01:00
colors [ ImGuiCustomCol_ToolbarGreen ] = ImColor ( 56 , 139 , 66 ) ;
colors [ ImGuiCustomCol_ToolbarBlue ] = ImColor ( 6 , 83 , 155 ) ;
2022-01-24 20:53:17 +01:00
colors [ ImGuiCustomCol_ToolbarPurple ] = ImColor ( 103 , 42 , 120 ) ;
2022-02-01 22:09:44 +01:00
colors [ ImGuiCustomCol_ToolbarBrown ] = ImColor ( 219 , 179 , 119 ) ;
2021-08-28 16:02:53 +02:00
2022-01-24 20:53:17 +01:00
colors [ ImGuiCustomCol_Highlight ] = ImColor ( 77 , 198 , 155 ) ;
2021-02-25 00:17:41 +01:00
}
2021-09-28 12:34:55 +02:00
void OpenPopupInWindow ( const char * window_name , const char * popup_name ) {
if ( ImGui : : Begin ( window_name ) ) {
ImGui : : OpenPopup ( popup_name ) ;
}
ImGui : : End ( ) ;
}
2021-08-21 00:51:50 +02:00
2022-01-24 20:53:17 +01:00
bool TitleBarButton ( const char * label , ImVec2 size_arg ) {
ImGuiWindow * window = GetCurrentWindow ( ) ;
2021-08-21 00:51:50 +02:00
if ( window - > SkipItems )
return false ;
2022-02-01 22:09:44 +01:00
ImGuiContext & g = * GImGui ;
2022-01-24 20:53:17 +01:00
const ImGuiStyle & style = g . Style ;
2022-02-01 22:09:44 +01:00
const ImGuiID id = window - > GetID ( label ) ;
2022-10-02 17:30:26 +02:00
const ImVec2 label_size = CalcTextSize ( label , nullptr , true ) ;
2021-08-21 00:51:50 +02:00
ImVec2 pos = window - > DC . CursorPos ;
ImVec2 size = CalcItemSize ( size_arg , label_size . x + style . FramePadding . x * 2.0f , label_size . y + style . FramePadding . y * 2.0f ) ;
const ImRect bb ( pos , pos + size ) ;
ItemSize ( size , style . FramePadding . y ) ;
if ( ! ItemAdd ( bb , id ) )
return false ;
bool hovered , held ;
bool pressed = ButtonBehavior ( bb , id , & hovered , & held ) ;
// Render
2022-01-24 20:53:17 +01:00
const ImU32 col = GetColorU32 ( ( held & & hovered ) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered
: ImGuiCol_Button ) ;
2021-08-21 00:51:50 +02:00
RenderNavHighlight ( bb , id ) ;
RenderFrame ( bb . Min , bb . Max , col , true , style . FrameRounding ) ;
2022-10-02 17:30:26 +02:00
RenderTextClipped ( bb . Min + style . FramePadding * ImVec2 ( 1 , 2 ) , bb . Max - style . FramePadding , label , nullptr , & label_size , style . ButtonTextAlign , & bb ) ;
2021-08-21 00:51:50 +02:00
// Automatically close popups
2022-01-24 20:53:17 +01:00
// if (pressed && !(flags & ImGuiButtonFlags_DontClosePopups) && (window->Flags & ImGuiWindowFlags_Popup))
2021-08-21 00:51:50 +02:00
// CloseCurrentPopup();
IMGUI_TEST_ENGINE_ITEM_INFO ( id , label , window - > DC . LastItemStatusFlags ) ;
return pressed ;
}
2022-01-24 20:53:17 +01:00
bool ToolBarButton ( const char * symbol , ImVec4 color ) {
ImGuiWindow * window = GetCurrentWindow ( ) ;
2021-08-21 00:51:50 +02:00
if ( window - > SkipItems )
return false ;
color . w = 1.0F ;
2022-02-01 22:09:44 +01:00
ImGuiContext & g = * GImGui ;
2022-01-24 20:53:17 +01:00
const ImGuiStyle & style = g . Style ;
2022-02-01 22:09:44 +01:00
const ImGuiID id = window - > GetID ( symbol ) ;
2022-10-02 17:30:26 +02:00
const ImVec2 label_size = CalcTextSize ( symbol , nullptr , true ) ;
2021-08-21 00:51:50 +02:00
ImVec2 pos = window - > DC . CursorPos ;
2021-10-07 11:34:46 +02:00
ImVec2 size = CalcItemSize ( ImVec2 ( 1 , 1 ) * ImGui : : GetCurrentWindow ( ) - > MenuBarHeight ( ) , label_size . x + style . FramePadding . x * 2.0f , label_size . y + style . FramePadding . y * 2.0f ) ;
2021-08-21 00:51:50 +02:00
const ImRect bb ( pos , pos + size ) ;
ItemSize ( size , style . FramePadding . y ) ;
if ( ! ItemAdd ( bb , id ) )
return false ;
bool hovered , held ;
bool pressed = ButtonBehavior ( bb , id , & hovered , & held ) ;
PushStyleColor ( ImGuiCol_Text , color ) ;
// Render
2022-01-24 20:53:17 +01:00
const ImU32 col = GetColorU32 ( ( held & & hovered ) ? ImGuiCol_ScrollbarGrabActive : hovered ? ImGuiCol_ScrollbarGrabHovered
: ImGuiCol_MenuBarBg ) ;
2021-08-21 00:51:50 +02:00
RenderNavHighlight ( bb , id ) ;
RenderFrame ( bb . Min , bb . Max , col , false , style . FrameRounding ) ;
2022-10-02 17:30:26 +02:00
RenderTextClipped ( bb . Min + style . FramePadding * ImVec2 ( 1 , 2 ) , bb . Max - style . FramePadding , symbol , nullptr , & label_size , style . ButtonTextAlign , & bb ) ;
2021-08-21 00:51:50 +02:00
PopStyleColor ( ) ;
// Automatically close popups
2022-01-24 20:53:17 +01:00
// if (pressed && !(flags & ImGuiButtonFlags_DontClosePopups) && (window->Flags & ImGuiWindowFlags_Popup))
2021-08-21 00:51:50 +02:00
// CloseCurrentPopup();
IMGUI_TEST_ENGINE_ITEM_INFO ( id , label , window - > DC . LastItemStatusFlags ) ;
return pressed ;
}
2022-01-24 20:53:17 +01:00
bool IconButton ( const char * symbol , ImVec4 color , ImVec2 size_arg ) {
ImGuiWindow * window = GetCurrentWindow ( ) ;
2021-10-07 11:34:46 +02:00
if ( window - > SkipItems )
return false ;
color . w = 1.0F ;
2022-02-01 22:09:44 +01:00
ImGuiContext & g = * GImGui ;
2022-01-24 20:53:17 +01:00
const ImGuiStyle & style = g . Style ;
2022-02-01 22:09:44 +01:00
const ImGuiID id = window - > GetID ( symbol ) ;
2022-10-02 17:30:26 +02:00
const ImVec2 label_size = CalcTextSize ( symbol , nullptr , true ) ;
2021-10-07 11:34:46 +02:00
ImVec2 pos = window - > DC . CursorPos ;
ImVec2 size = CalcItemSize ( size_arg , label_size . x + style . FramePadding . x * 2.0f , label_size . y + style . FramePadding . y * 2.0f ) ;
const ImRect bb ( pos , pos + size ) ;
ItemSize ( size , style . FramePadding . y ) ;
if ( ! ItemAdd ( bb , id ) )
return false ;
bool hovered , held ;
bool pressed = ButtonBehavior ( bb , id , & hovered , & held ) ;
PushStyleColor ( ImGuiCol_Text , color ) ;
// Render
2022-01-24 20:53:17 +01:00
const ImU32 col = GetColorU32 ( ( held & & hovered ) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered
: ImGuiCol_Button ) ;
2021-10-07 11:34:46 +02:00
RenderNavHighlight ( bb , id ) ;
RenderFrame ( bb . Min , bb . Max , col , false , style . FrameRounding ) ;
2022-10-02 17:30:26 +02:00
RenderTextClipped ( bb . Min + style . FramePadding * ImVec2 ( 1 , 2 ) , bb . Max - style . FramePadding , symbol , nullptr , & label_size , style . ButtonTextAlign , & bb ) ;
2021-10-07 11:34:46 +02:00
PopStyleColor ( ) ;
// Automatically close popups
2022-01-24 20:53:17 +01:00
// if (pressed && !(flags & ImGuiButtonFlags_DontClosePopups) && (window->Flags & ImGuiWindowFlags_Popup))
2021-10-07 11:34:46 +02:00
// CloseCurrentPopup();
IMGUI_TEST_ENGINE_ITEM_INFO ( id , label , window - > DC . LastItemStatusFlags ) ;
return pressed ;
}
2023-01-18 14:30:44 +01:00
bool InputIntegerPrefix ( const char * label , const char * prefix , void * value , ImGuiDataType type , const char * format , ImGuiInputTextFlags flags ) {
2022-02-08 21:10:48 +01:00
auto window = ImGui : : GetCurrentWindow ( ) ;
const ImGuiID id = window - > GetID ( label ) ;
const ImGuiStyle & style = GImGui - > Style ;
const ImVec2 label_size = CalcTextSize ( label , nullptr , true ) ;
const ImVec2 frame_size = CalcItemSize ( ImVec2 ( 0 , 0 ) , CalcTextSize ( prefix ) . x , label_size . y + style . FramePadding . y * 2.0f ) ;
const ImRect frame_bb ( window - > DC . CursorPos , window - > DC . CursorPos + frame_size ) ;
2022-02-08 21:51:09 +01:00
ImGui : : SetCursorPosX ( ImGui : : GetCursorPosX ( ) + frame_size . x ) ;
char buf [ 64 ] ;
2023-01-18 14:30:44 +01:00
DataTypeFormatString ( buf , IM_ARRAYSIZE ( buf ) , type , value , format ) ;
2022-02-08 21:51:09 +01:00
bool value_changed = false ;
if ( InputTextEx ( label , nullptr , buf , IM_ARRAYSIZE ( buf ) , ImVec2 ( CalcItemWidth ( ) - frame_size . x , label_size . y + style . FramePadding . y * 2.0f ) , flags ) )
2023-01-18 14:30:44 +01:00
value_changed = DataTypeApplyFromText ( buf , type , value , format ) ;
2022-02-08 21:51:09 +01:00
if ( value_changed )
MarkItemEdited ( GImGui - > LastItemData . ID ) ;
2022-02-08 21:10:48 +01:00
RenderNavHighlight ( frame_bb , id ) ;
RenderFrame ( frame_bb . Min , frame_bb . Max , GetColorU32 ( ImGuiCol_FrameBg ) , true , style . FrameRounding ) ;
2022-02-08 22:19:54 +01:00
ImGui : : PushStyleVar ( ImGuiStyleVar_Alpha , 0.6F ) ;
2022-02-08 21:10:48 +01:00
RenderText ( ImVec2 ( frame_bb . Min . x + style . FramePadding . x , frame_bb . Min . y + style . FramePadding . y ) , prefix ) ;
2022-02-08 22:19:54 +01:00
ImGui : : PopStyleVar ( ) ;
2022-02-08 21:10:48 +01:00
2022-02-08 21:51:09 +01:00
return value_changed ;
2022-02-08 21:10:48 +01:00
}
2022-05-30 16:36:46 +02:00
bool InputHexadecimal ( const char * label , u32 * value , ImGuiInputTextFlags flags ) {
2023-01-18 14:30:44 +01:00
return InputIntegerPrefix ( label , " 0x " , value , ImGuiDataType_U32 , " %lX " , flags | ImGuiInputTextFlags_CharsHexadecimal ) ;
2022-05-30 16:36:46 +02:00
}
2022-02-08 22:25:25 +01:00
bool InputHexadecimal ( const char * label , u64 * value , ImGuiInputTextFlags flags ) {
2023-01-18 14:30:44 +01:00
return InputIntegerPrefix ( label , " 0x " , value , ImGuiDataType_U64 , " %llX " , flags | ImGuiInputTextFlags_CharsHexadecimal ) ;
2022-02-08 21:10:48 +01:00
}
2021-12-16 23:48:52 +01:00
void SmallProgressBar ( float fraction , float yOffset ) {
2022-01-24 20:53:17 +01:00
ImGuiWindow * window = GetCurrentWindow ( ) ;
2021-12-16 23:48:52 +01:00
if ( window - > SkipItems )
return ;
2022-02-01 22:09:44 +01:00
ImGuiContext & g = * GImGui ;
2022-01-24 20:53:17 +01:00
const ImGuiStyle & style = g . Style ;
2021-12-16 23:48:52 +01:00
2022-02-01 22:09:44 +01:00
ImVec2 pos = window - > DC . CursorPos + ImVec2 ( 0 , yOffset ) ;
2022-08-17 16:15:36 +02:00
ImVec2 size = CalcItemSize ( ImVec2 ( 100 , 5 ) * hex : : ImHexApi : : System : : getGlobalScale ( ) , 100 , g . FontSize + style . FramePadding . y * 2.0f ) ;
2021-12-16 23:48:52 +01:00
ImRect bb ( pos , pos + size ) ;
ItemSize ( size , 0 ) ;
if ( ! ItemAdd ( bb , 0 ) )
return ;
// Render
fraction = ImSaturate ( fraction ) ;
RenderFrame ( bb . Min , bb . Max , GetColorU32 ( ImGuiCol_FrameBg ) , true , style . FrameRounding ) ;
bb . Expand ( ImVec2 ( - style . FrameBorderSize , - style . FrameBorderSize ) ) ;
RenderRectFilledRangeH ( window - > DrawList , bb , GetColorU32 ( ImGuiCol_PlotHistogram ) , 0.0f , fraction , style . FrameRounding ) ;
}
2022-03-03 09:24:09 +01:00
bool InputText ( const char * label , std : : string & buffer , ImGuiInputTextFlags flags ) {
2022-04-14 15:29:54 +02:00
return ImGui : : InputText ( label , buffer . data ( ) , buffer . size ( ) + 1 , ImGuiInputTextFlags_CallbackResize | flags , ImGui : : UpdateStringSizeCallback , & buffer ) ;
2022-03-03 09:24:09 +01:00
}
2022-09-19 11:29:51 +02:00
bool InputTextIcon ( const char * label , const char * icon , std : : string & buffer , ImGuiInputTextFlags flags ) {
auto window = ImGui : : GetCurrentWindow ( ) ;
const ImGuiID id = window - > GetID ( label ) ;
const ImGuiStyle & style = GImGui - > Style ;
const ImVec2 label_size = CalcTextSize ( label , nullptr , true ) ;
const ImVec2 icon_frame_size = CalcTextSize ( icon ) + style . FramePadding * 2.0f ;
const ImVec2 frame_size = CalcItemSize ( ImVec2 ( 0 , 0 ) , icon_frame_size . x , label_size . y + style . FramePadding . y * 2.0f ) ;
const ImRect frame_bb ( window - > DC . CursorPos , window - > DC . CursorPos + frame_size ) ;
ImGui : : SetCursorPosX ( ImGui : : GetCursorPosX ( ) + frame_size . x ) ;
bool value_changed = ImGui : : InputTextEx ( label , nullptr , buffer . data ( ) , buffer . size ( ) + 1 , ImVec2 ( CalcItemWidth ( ) - frame_size . x , label_size . y + style . FramePadding . y * 2.0f ) , ImGuiInputTextFlags_CallbackResize | flags , ImGui : : UpdateStringSizeCallback , & buffer ) ;
if ( value_changed )
MarkItemEdited ( GImGui - > LastItemData . ID ) ;
RenderNavHighlight ( frame_bb , id ) ;
RenderFrame ( frame_bb . Min , frame_bb . Max , GetColorU32 ( ImGuiCol_FrameBg ) , true , style . FrameRounding ) ;
RenderFrame ( frame_bb . Min , frame_bb . Min + icon_frame_size , GetColorU32 ( ImGuiCol_TableBorderStrong ) , true , style . FrameRounding ) ;
RenderText ( ImVec2 ( frame_bb . Min . x + style . FramePadding . x , frame_bb . Min . y + style . FramePadding . y * 2 ) , icon ) ;
return value_changed ;
}
2022-07-23 20:38:38 +02:00
bool InputTextWithHint ( const char * label , const char * hint , std : : string & buffer , ImGuiInputTextFlags flags ) {
return ImGui : : InputTextWithHint ( label , hint , buffer . data ( ) , buffer . size ( ) + 1 , ImGuiInputTextFlags_CallbackResize | flags , ImGui : : UpdateStringSizeCallback , & buffer ) ;
}
2022-07-05 00:00:00 +02:00
bool InputText ( const char * label , std : : u8string & buffer , ImGuiInputTextFlags flags ) {
return ImGui : : InputText ( label , reinterpret_cast < char * > ( buffer . data ( ) ) , buffer . size ( ) + 1 , ImGuiInputTextFlags_CallbackResize | flags , ImGui : : UpdateStringSizeCallback , & buffer ) ;
}
2022-03-03 09:24:09 +01:00
bool InputTextMultiline ( const char * label , std : : string & buffer , const ImVec2 & size , ImGuiInputTextFlags flags ) {
2022-04-14 15:29:54 +02:00
return ImGui : : InputTextMultiline ( label , buffer . data ( ) , buffer . size ( ) + 1 , size , ImGuiInputTextFlags_CallbackResize | flags , ImGui : : UpdateStringSizeCallback , & buffer ) ;
2022-03-03 09:24:09 +01:00
}
2022-05-27 20:42:07 +02:00
bool InputScalarCallback ( const char * label , ImGuiDataType data_type , void * p_data , const char * format , ImGuiInputTextFlags flags , ImGuiInputTextCallback callback , void * user_data ) {
ImGuiWindow * window = GetCurrentWindow ( ) ;
if ( window - > SkipItems )
return false ;
ImGuiContext & g = * GImGui ;
2022-10-02 17:30:26 +02:00
if ( format = = nullptr )
2022-05-27 20:42:07 +02:00
format = DataTypeGetInfo ( data_type ) - > PrintFmt ;
char buf [ 64 ] ;
DataTypeFormatString ( buf , IM_ARRAYSIZE ( buf ) , data_type , p_data , format ) ;
bool value_changed = false ;
if ( ( flags & ( ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsScientific ) ) = = 0 )
flags | = ImGuiInputTextFlags_CharsDecimal ;
flags | = ImGuiInputTextFlags_AutoSelectAll ;
flags | = ImGuiInputTextFlags_NoMarkEdited ; // We call MarkItemEdited() ourselves by comparing the actual data rather than the string.
if ( InputText ( label , buf , IM_ARRAYSIZE ( buf ) , flags , callback , user_data ) )
2022-08-03 23:32:34 +02:00
value_changed = DataTypeApplyFromText ( buf , data_type , p_data , format ) ;
2022-05-27 20:42:07 +02:00
if ( value_changed )
MarkItemEdited ( g . LastItemData . ID ) ;
return value_changed ;
}
void HideTooltip ( ) {
char window_name [ 16 ] ;
ImFormatString ( window_name , IM_ARRAYSIZE ( window_name ) , " ##Tooltip_%02d " , GImGui - > TooltipOverrideCount ) ;
if ( ImGuiWindow * window = FindWindowByName ( window_name ) ; window ! = nullptr ) {
if ( window - > Active )
window - > Hidden = true ;
}
}
2022-05-29 14:57:59 +02:00
bool BitCheckbox ( const char * label , bool * v ) {
ImGuiWindow * window = GetCurrentWindow ( ) ;
if ( window - > SkipItems )
return false ;
ImGuiContext & g = * GImGui ;
const ImGuiStyle & style = g . Style ;
const ImGuiID id = window - > GetID ( label ) ;
2022-10-02 17:30:26 +02:00
const ImVec2 label_size = CalcTextSize ( label , nullptr , true ) ;
2022-05-29 14:57:59 +02:00
const ImVec2 size = ImVec2 ( CalcTextSize ( " 0 " ) . x + style . FramePadding . x * 2 , GetFrameHeight ( ) ) ;
const ImVec2 pos = window - > DC . CursorPos ;
const ImRect total_bb ( pos , pos + size ) ;
ItemSize ( total_bb , style . FramePadding . y ) ;
if ( ! ItemAdd ( total_bb , id ) )
{
IMGUI_TEST_ENGINE_ITEM_INFO ( id , label , g . LastItemData . StatusFlags | ImGuiItemStatusFlags_Checkable | ( * v ? ImGuiItemStatusFlags_Checked : 0 ) ) ;
return false ;
}
bool hovered , held ;
bool pressed = ButtonBehavior ( total_bb , id , & hovered , & held ) ;
if ( pressed )
{
* v = ! ( * v ) ;
MarkItemEdited ( id ) ;
}
const ImRect check_bb ( pos , pos + size ) ;
RenderNavHighlight ( total_bb , id ) ;
RenderFrame ( check_bb . Min , check_bb . Max , GetColorU32 ( ( held & & hovered ) ? ImGuiCol_FrameBgActive : hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg ) , true , style . FrameRounding ) ;
RenderText ( check_bb . Min + style . FramePadding , * v ? " 1 " : " 0 " ) ;
ImVec2 label_pos = ImVec2 ( check_bb . Max . x + style . ItemInnerSpacing . x , check_bb . Min . y + style . FramePadding . y ) ;
if ( label_size . x > 0.0f )
RenderText ( label_pos , label ) ;
IMGUI_TEST_ENGINE_ITEM_INFO ( id , label , g . LastItemData . StatusFlags | ImGuiItemStatusFlags_Checkable | ( * v ? ImGuiItemStatusFlags_Checked : 0 ) ) ;
return pressed ;
}
2021-01-27 00:00:20 +01:00
}