mirror of
https://github.com/Drezil/imgui.git
synced 2025-09-16 08:03:14 +02:00
Merge branch 'master' into docking + tweak dock node padding + use CheckboxFlags with int
# Conflicts: # imgui.cpp # imgui_demo.cpp # imgui_internal.h
This commit is contained in:
@ -408,6 +408,7 @@ void ImGui::BulletTextV(const char* fmt, va_list args)
|
||||
// - Image()
|
||||
// - ImageButton()
|
||||
// - Checkbox()
|
||||
// - CheckboxFlagsT() [Internal]
|
||||
// - CheckboxFlags()
|
||||
// - RadioButton()
|
||||
// - ProgressBar()
|
||||
@ -1082,6 +1083,7 @@ bool ImGui::Checkbox(const char* label, bool* v)
|
||||
if (mixed_value)
|
||||
{
|
||||
// Undocumented tristate/mixed/indeterminate checkbox (#2644)
|
||||
// This may seem awkwardly designed because the aim is to make ImGuiItemFlags_MixedValue supported by all widgets (not just checkbox)
|
||||
ImVec2 pad(ImMax(1.0f, IM_FLOOR(square_sz / 3.6f)), ImMax(1.0f, IM_FLOOR(square_sz / 3.6f)));
|
||||
window->DrawList->AddRectFilled(check_bb.Min + pad, check_bb.Max - pad, check_col, style.FrameRounding);
|
||||
}
|
||||
@ -1100,35 +1102,45 @@ bool ImGui::Checkbox(const char* label, bool* v)
|
||||
return pressed;
|
||||
}
|
||||
|
||||
bool ImGui::CheckboxFlags(const char* label, unsigned int* flags, unsigned int flags_value)
|
||||
template<typename T>
|
||||
bool ImGui::CheckboxFlagsT(const char* label, T* flags, T flags_value)
|
||||
{
|
||||
bool v = ((*flags & flags_value) == flags_value);
|
||||
bool all_on = (*flags & flags_value) == flags_value;
|
||||
bool any_on = (*flags & flags_value) != 0;
|
||||
bool pressed;
|
||||
if (v == false && (*flags & flags_value) != 0)
|
||||
if (!all_on && any_on)
|
||||
{
|
||||
// Mixed value (FIXME: find a way to expose neatly to Checkbox?)
|
||||
ImGuiWindow* window = GetCurrentWindow();
|
||||
const ImGuiItemFlags backup_item_flags = window->DC.ItemFlags;
|
||||
ImGuiItemFlags backup_item_flags = window->DC.ItemFlags;
|
||||
window->DC.ItemFlags |= ImGuiItemFlags_MixedValue;
|
||||
pressed = Checkbox(label, &v);
|
||||
pressed = Checkbox(label, &all_on);
|
||||
window->DC.ItemFlags = backup_item_flags;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Regular checkbox
|
||||
pressed = Checkbox(label, &v);
|
||||
pressed = Checkbox(label, &all_on);
|
||||
|
||||
}
|
||||
if (pressed)
|
||||
{
|
||||
if (v)
|
||||
if (all_on)
|
||||
*flags |= flags_value;
|
||||
else
|
||||
*flags &= ~flags_value;
|
||||
}
|
||||
|
||||
return pressed;
|
||||
}
|
||||
|
||||
bool ImGui::CheckboxFlags(const char* label, int* flags, int flags_value)
|
||||
{
|
||||
return CheckboxFlagsT(label, flags, flags_value);
|
||||
}
|
||||
|
||||
bool ImGui::CheckboxFlags(const char* label, unsigned int* flags, unsigned int flags_value)
|
||||
{
|
||||
return CheckboxFlagsT(label, flags, flags_value);
|
||||
}
|
||||
|
||||
bool ImGui::RadioButton(const char* label, bool active)
|
||||
{
|
||||
ImGuiWindow* window = GetCurrentWindow();
|
||||
@ -5444,7 +5456,7 @@ void ImGui::ColorPickerOptionsPopup(const float* ref_col, ImGuiColorEditFlags fl
|
||||
if (allow_opt_alpha_bar)
|
||||
{
|
||||
if (allow_opt_picker) Separator();
|
||||
CheckboxFlags("Alpha Bar", (unsigned int*)&g.ColorEditOptions, ImGuiColorEditFlags_AlphaBar);
|
||||
CheckboxFlags("Alpha Bar", &g.ColorEditOptions, ImGuiColorEditFlags_AlphaBar);
|
||||
}
|
||||
EndPopup();
|
||||
}
|
||||
@ -5919,10 +5931,6 @@ bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags fl
|
||||
ImGuiContext& g = *GImGui;
|
||||
const ImGuiStyle& style = g.Style;
|
||||
|
||||
const bool span_all_columns = (flags & ImGuiSelectableFlags_SpanAllColumns) != 0;
|
||||
if (span_all_columns && window->DC.CurrentColumns) // FIXME-OPT: Avoid if vertically clipped.
|
||||
PushColumnsBackground();
|
||||
|
||||
// Submit label or explicit size to ItemSize(), whereas ItemAdd() will submit a larger/spanning rectangle.
|
||||
ImGuiID id = window->GetID(label);
|
||||
ImVec2 label_size = CalcTextSize(label, NULL, true);
|
||||
@ -5933,6 +5941,7 @@ bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags fl
|
||||
|
||||
// Fill horizontal space
|
||||
// We don't support (size < 0.0f) in Selectable() because the ItemSpacing extension would make explicitely right-aligned sizes not visibly match other widgets.
|
||||
const bool span_all_columns = (flags & ImGuiSelectableFlags_SpanAllColumns) != 0;
|
||||
const float min_x = span_all_columns ? window->ParentWorkRect.Min.x : pos.x;
|
||||
const float max_x = span_all_columns ? window->ParentWorkRect.Max.x : window->WorkRect.Max.x;
|
||||
if (size_arg.x == 0.0f || (flags & ImGuiSelectableFlags_SpanAvailWidth))
|
||||
@ -5957,6 +5966,15 @@ bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags fl
|
||||
}
|
||||
//if (g.IO.KeyCtrl) { GetForegroundDrawList()->AddRect(bb.Min, bb.Max, IM_COL32(0, 255, 0, 255)); }
|
||||
|
||||
// Modify ClipRect for the ItemAdd(), faster than doing a PushColumnsBackground/PushTableBackground for every Selectable..
|
||||
const float backup_clip_rect_min_x = window->ClipRect.Min.x;
|
||||
const float backup_clip_rect_max_x = window->ClipRect.Max.x;
|
||||
if (span_all_columns)
|
||||
{
|
||||
window->ClipRect.Min.x = window->ParentWorkRect.Min.x;
|
||||
window->ClipRect.Max.x = window->ParentWorkRect.Max.x;
|
||||
}
|
||||
|
||||
bool item_add;
|
||||
if (flags & ImGuiSelectableFlags_Disabled)
|
||||
{
|
||||
@ -5969,13 +5987,21 @@ bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags fl
|
||||
{
|
||||
item_add = ItemAdd(bb, id);
|
||||
}
|
||||
if (!item_add)
|
||||
|
||||
if (span_all_columns)
|
||||
{
|
||||
if (span_all_columns && window->DC.CurrentColumns)
|
||||
PopColumnsBackground();
|
||||
return false;
|
||||
window->ClipRect.Min.x = backup_clip_rect_min_x;
|
||||
window->ClipRect.Max.x = backup_clip_rect_max_x;
|
||||
}
|
||||
|
||||
if (!item_add)
|
||||
return false;
|
||||
|
||||
// FIXME: We can standardize the behavior of those two, we could also keep the fast path of override ClipRect + full push on render only,
|
||||
// which would be advantageous since most selectable are not selected.
|
||||
if (span_all_columns && window->DC.CurrentColumns)
|
||||
PushColumnsBackground();
|
||||
|
||||
// We use NoHoldingActiveID on menus so user can click and _hold_ on a menu then drag to browse child entries
|
||||
ImGuiButtonFlags button_flags = 0;
|
||||
if (flags & ImGuiSelectableFlags_NoHoldingActiveID) { button_flags |= ImGuiButtonFlags_NoHoldingActiveId; }
|
||||
@ -6384,13 +6410,6 @@ void ImGui::Value(const char* prefix, float v, const char* float_format)
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
// Helpers for internal use
|
||||
ImGuiMenuColumns::ImGuiMenuColumns()
|
||||
{
|
||||
Spacing = Width = NextWidth = 0.0f;
|
||||
memset(Pos, 0, sizeof(Pos));
|
||||
memset(NextWidths, 0, sizeof(NextWidths));
|
||||
}
|
||||
|
||||
void ImGuiMenuColumns::Update(int count, float spacing, bool clear)
|
||||
{
|
||||
IM_ASSERT(count == IM_ARRAYSIZE(Pos));
|
||||
|
Reference in New Issue
Block a user