mirror of
https://github.com/Drezil/imgui.git
synced 2024-11-24 12:47:01 +00:00
InputText, ColorEdit, ColorPicker: better support for undocumented ImGuiItemFlags_ReadOnly flag. (#7079, #211)
Amend fdc526e8f
This commit is contained in:
parent
b112d73edb
commit
5768de79e2
@ -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 RENDER_SELECTION_WHEN_INACTIVE = false;
|
||||||
const bool is_multiline = (flags & ImGuiInputTextFlags_Multiline) != 0;
|
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)
|
if (is_multiline) // Open group before calling GetID() because groups tracks id created within their scope (including the scrollbar)
|
||||||
BeginGroup();
|
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.
|
// We are only allowed to access the state if we are already the active widget.
|
||||||
ImGuiInputTextState* state = GetInputTextState(id);
|
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_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)));
|
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 (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)
|
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!
|
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() ?
|
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)
|
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
|
// Drag and Drop Target
|
||||||
// NB: The flag test is merely an optional micro-optimization, BeginDragDropTarget() does the same test.
|
// 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;
|
bool accepted_drag_drop = false;
|
||||||
if (const ImGuiPayload* payload = AcceptDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_3F))
|
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;
|
ImGuiIO& io = g.IO;
|
||||||
|
|
||||||
const float width = CalcItemWidth();
|
const float width = CalcItemWidth();
|
||||||
|
const bool is_readonly = ((g.NextItemData.ItemFlags | g.CurrentItemFlags) & ImGuiItemFlags_ReadOnly) != 0;
|
||||||
g.NextItemData.ClearFlags();
|
g.NextItemData.ClearFlags();
|
||||||
|
|
||||||
PushID(label);
|
PushID(label);
|
||||||
@ -5472,7 +5476,7 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl
|
|||||||
{
|
{
|
||||||
// Hue wheel + SV triangle logic
|
// Hue wheel + SV triangle logic
|
||||||
InvisibleButton("hsv", ImVec2(sv_picker_size + style.ItemInnerSpacing.x + bars_width, sv_picker_size));
|
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 initial_off = g.IO.MouseClickedPos[0] - wheel_center;
|
||||||
ImVec2 current_off = g.IO.MousePos - 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
|
// SV rectangle logic
|
||||||
InvisibleButton("sv", ImVec2(sv_picker_size, sv_picker_size));
|
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));
|
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));
|
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
|
// Hue bar logic
|
||||||
SetCursorScreenPos(ImVec2(bar0_pos_x, picker_pos.y));
|
SetCursorScreenPos(ImVec2(bar0_pos_x, picker_pos.y));
|
||||||
InvisibleButton("hue", ImVec2(bars_width, sv_picker_size));
|
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));
|
H = ImSaturate((io.MousePos.y - picker_pos.y) / (sv_picker_size - 1));
|
||||||
value_changed = value_changed_h = true;
|
value_changed = value_changed_h = true;
|
||||||
|
Loading…
Reference in New Issue
Block a user