@ -4105,12 +4105,6 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
const bool RENDER_SELECTION_WHEN_INACTIVE = false ;
const bool is_multiline = ( flags & ImGuiInputTextFlags_Multiline ) ! = 0 ;
const bool is_readonly = ( flags & ImGuiInputTextFlags_ReadOnly ) ! = 0 ;
const bool is_password = ( flags & ImGuiInputTextFlags_Password ) ! = 0 ;
const bool is_undoable = ( flags & ImGuiInputTextFlags_NoUndoRedo ) = = 0 ;
const bool is_resizable = ( flags & ImGuiInputTextFlags_CallbackResize ) ! = 0 ;
if ( is_resizable )
IM_ASSERT ( callback ! = NULL ) ; // Must provide a callback if you set the ImGuiInputTextFlags_CallbackResize flag!
if ( is_multiline ) // Open group before calling GetID() because groups tracks id created within their scope (including the scrollbar)
BeginGroup ( ) ;
@ -4180,6 +4174,15 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
// We are only allowed to access the state if we are already the active widget.
ImGuiInputTextState * state = GetInputTextState ( id ) ;
if ( g . LastItemData . InFlags & ImGuiItemFlags_ReadOnly )
flags | = ImGuiInputTextFlags_ReadOnly ;
const bool is_readonly = ( flags & ImGuiInputTextFlags_ReadOnly ) ! = 0 ;
const bool is_password = ( flags & ImGuiInputTextFlags_Password ) ! = 0 ;
const bool is_undoable = ( flags & ImGuiInputTextFlags_NoUndoRedo ) = = 0 ;
const bool is_resizable = ( flags & ImGuiInputTextFlags_CallbackResize ) ! = 0 ;
if ( is_resizable )
IM_ASSERT ( callback ! = NULL ) ; // Must provide a callback if you set the ImGuiInputTextFlags_CallbackResize flag!
const bool input_requested_by_tabbing = ( item_status_flags & ImGuiItemStatusFlags_FocusedByTabbing ) ! = 0 ;
const bool input_requested_by_nav = ( g . ActiveId ! = id ) & & ( ( g . NavActivateId = = id ) & & ( ( g . NavActivateFlags & ImGuiActivateFlags_PreferInput ) | | ( g . NavInputSource = = ImGuiInputSource_Keyboard ) ) ) ;
@ -4716,7 +4719,7 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
if ( callback_data . SelectionEnd ! = utf8_selection_end | | buf_dirty ) { state - > Stb . select_end = ( callback_data . SelectionEnd = = callback_data . SelectionStart ) ? state - > Stb . select_start : ImTextCountCharsFromUtf8 ( callback_data . Buf , callback_data . Buf + callback_data . SelectionEnd ) ; }
if ( buf_dirty )
{
IM_ASSERT ( ( flags & ImGuiInputTextFlags_ReadOnly ) = = 0 ) ;
IM_ASSERT ( ! is_readonly ) ;
IM_ASSERT ( callback_data . BufTextLen = = ( int ) strlen ( callback_data . Buf ) ) ; // You need to maintain BufTextLen if you change the text!
InputTextReconcileUndoStateAfterUserCallback ( state , callback_data . Buf , callback_data . BufTextLen ) ; // FIXME: Move the rest of this block inside function and rename to InputTextReconcileStateAfterUserCallback() ?
if ( callback_data . BufTextLen > backup_current_text_length & & is_resizable )
@ -5337,7 +5340,7 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag
// Drag and Drop Target
// NB: The flag test is merely an optional micro-optimization, BeginDragDropTarget() does the same test.
if ( ( g . LastItemData . StatusFlags & ImGuiItemStatusFlags_HoveredRect ) & & ! ( flags & ImGuiColorEditFlags_NoDragDrop ) & & BeginDragDropTarget ( ) )
if ( ( g . LastItemData . StatusFlags & ImGuiItemStatusFlags_HoveredRect ) & & ! ( g . LastItemData . InFlags & ImGuiItemFlags_ReadOnly ) & & ! ( flags & ImGuiColorEditFlags_NoDragDrop ) & & BeginDragDropTarget ( ) )
{
bool accepted_drag_drop = false ;
if ( const ImGuiPayload * payload = AcceptDragDropPayload ( IMGUI_PAYLOAD_TYPE_COLOR_3F ) )
@ -5402,6 +5405,7 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl
ImGuiIO & io = g . IO ;
const float width = CalcItemWidth ( ) ;
const bool is_readonly = ( ( g . NextItemData . ItemFlags | g . CurrentItemFlags ) & ImGuiItemFlags_ReadOnly ) ! = 0 ;
g . NextItemData . ClearFlags ( ) ;
PushID ( label ) ;
@ -5472,7 +5476,7 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl
{
// Hue wheel + SV triangle logic
InvisibleButton ( " hsv " , ImVec2 ( sv_picker_size + style . ItemInnerSpacing . x + bars_width , sv_picker_size ) ) ;
if ( IsItemActive ( ) )
if ( IsItemActive ( ) & & ! is_readonly )
{
ImVec2 initial_off = g . IO . MouseClickedPos [ 0 ] - wheel_center ;
ImVec2 current_off = g . IO . MousePos - wheel_center ;
@ -5507,7 +5511,7 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl
{
// SV rectangle logic
InvisibleButton ( " sv " , ImVec2 ( sv_picker_size , sv_picker_size ) ) ;
if ( IsItemActive ( ) )
if ( IsItemActive ( ) & & ! is_readonly )
{
S = ImSaturate ( ( io . MousePos . x - picker_pos . x ) / ( sv_picker_size - 1 ) ) ;
V = 1.0f - ImSaturate ( ( io . MousePos . y - picker_pos . y ) / ( sv_picker_size - 1 ) ) ;
@ -5520,7 +5524,7 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl
// Hue bar logic
SetCursorScreenPos ( ImVec2 ( bar0_pos_x , picker_pos . y ) ) ;
InvisibleButton ( " hue " , ImVec2 ( bars_width , sv_picker_size ) ) ;
if ( IsItemActive ( ) )
if ( IsItemActive ( ) & & ! is_readonly )
{
H = ImSaturate ( ( io . MousePos . y - picker_pos . y ) / ( sv_picker_size - 1 ) ) ;
value_changed = value_changed_h = true ;