|
@@ -3202,59 +3202,58 @@ static void ShowDemoWindowLayout()
|
|
|
ImGui::DragFloat2("size", (float*)&size, 0.5f, 1.0f, 200.0f, "%.0f");
|
|
|
ImGui::TextWrapped("(Click and drag to scroll)");
|
|
|
|
|
|
+ HelpMarker(
|
|
|
+ "(Left) Using ImGui::PushClipRect():\n"
|
|
|
+ "Will alter ImGui hit-testing logic + ImDrawList rendering.\n"
|
|
|
+ "(use this if you want your clipping rectangle to affect interactions)\n\n"
|
|
|
+ "(Center) Using ImDrawList::PushClipRect():\n"
|
|
|
+ "Will alter ImDrawList rendering only.\n"
|
|
|
+ "(use this as a shortcut if you are only using ImDrawList calls)\n\n"
|
|
|
+ "(Right) Using ImDrawList::AddText() with a fine ClipRect:\n"
|
|
|
+ "Will alter only this specific ImDrawList::AddText() rendering.\n"
|
|
|
+ "This is often used internally to avoid altering the clipping rectangle and minimize draw calls.");
|
|
|
+
|
|
|
for (int n = 0; n < 3; n++)
|
|
|
{
|
|
|
if (n > 0)
|
|
|
ImGui::SameLine();
|
|
|
- ImGui::PushID(n);
|
|
|
- ImGui::BeginGroup(); // Lock X position
|
|
|
|
|
|
- ImGui::InvisibleButton("##empty", size);
|
|
|
+ ImGui::PushID(n);
|
|
|
+ ImGui::InvisibleButton("##canvas", size);
|
|
|
if (ImGui::IsItemActive() && ImGui::IsMouseDragging(ImGuiMouseButton_Left))
|
|
|
{
|
|
|
offset.x += ImGui::GetIO().MouseDelta.x;
|
|
|
offset.y += ImGui::GetIO().MouseDelta.y;
|
|
|
}
|
|
|
+ ImGui::PopID();
|
|
|
+ if (!ImGui::IsItemVisible()) // Skip rendering as ImDrawList elements are not clipped.
|
|
|
+ continue;
|
|
|
+
|
|
|
const ImVec2 p0 = ImGui::GetItemRectMin();
|
|
|
const ImVec2 p1 = ImGui::GetItemRectMax();
|
|
|
const char* text_str = "Line 1 hello\nLine 2 clip me!";
|
|
|
const ImVec2 text_pos = ImVec2(p0.x + offset.x, p0.y + offset.y);
|
|
|
ImDrawList* draw_list = ImGui::GetWindowDrawList();
|
|
|
-
|
|
|
switch (n)
|
|
|
{
|
|
|
case 0:
|
|
|
- HelpMarker(
|
|
|
- "Using ImGui::PushClipRect():\n"
|
|
|
- "Will alter ImGui hit-testing logic + ImDrawList rendering.\n"
|
|
|
- "(use this if you want your clipping rectangle to affect interactions)");
|
|
|
ImGui::PushClipRect(p0, p1, true);
|
|
|
draw_list->AddRectFilled(p0, p1, IM_COL32(90, 90, 120, 255));
|
|
|
draw_list->AddText(text_pos, IM_COL32_WHITE, text_str);
|
|
|
ImGui::PopClipRect();
|
|
|
break;
|
|
|
case 1:
|
|
|
- HelpMarker(
|
|
|
- "Using ImDrawList::PushClipRect():\n"
|
|
|
- "Will alter ImDrawList rendering only.\n"
|
|
|
- "(use this as a shortcut if you are only using ImDrawList calls)");
|
|
|
draw_list->PushClipRect(p0, p1, true);
|
|
|
draw_list->AddRectFilled(p0, p1, IM_COL32(90, 90, 120, 255));
|
|
|
draw_list->AddText(text_pos, IM_COL32_WHITE, text_str);
|
|
|
draw_list->PopClipRect();
|
|
|
break;
|
|
|
case 2:
|
|
|
- HelpMarker(
|
|
|
- "Using ImDrawList::AddText() with a fine ClipRect:\n"
|
|
|
- "Will alter only this specific ImDrawList::AddText() rendering.\n"
|
|
|
- "(this is often used internally to avoid altering the clipping rectangle and minimize draw calls)");
|
|
|
ImVec4 clip_rect(p0.x, p0.y, p1.x, p1.y); // AddText() takes a ImVec4* here so let's convert.
|
|
|
draw_list->AddRectFilled(p0, p1, IM_COL32(90, 90, 120, 255));
|
|
|
draw_list->AddText(ImGui::GetFont(), ImGui::GetFontSize(), text_pos, IM_COL32_WHITE, text_str, NULL, 0.0f, &clip_rect);
|
|
|
break;
|
|
|
}
|
|
|
- ImGui::EndGroup();
|
|
|
- ImGui::PopID();
|
|
|
}
|
|
|
|
|
|
ImGui::TreePop();
|
|
@@ -4841,7 +4840,7 @@ static void ShowDemoWindowTables()
|
|
|
ImGui::TableSetColumnIndex(1);
|
|
|
ImGui::SliderFloat("float1", &dummy_f, 0.0f, 1.0f);
|
|
|
ImGui::TableSetColumnIndex(2);
|
|
|
- ImGui::SliderFloat("float2", &dummy_f, 0.0f, 1.0f);
|
|
|
+ ImGui::SliderFloat("##float2", &dummy_f, 0.0f, 1.0f); // No visible label since right-aligned
|
|
|
ImGui::PopID();
|
|
|
}
|
|
|
ImGui::EndTable();
|
|
@@ -5755,26 +5754,31 @@ static void ShowDemoWindowMisc()
|
|
|
{ 2, 0, "", ImGuiKey_LeftShift },{ 2, 1, "Z", ImGuiKey_Z }, { 2, 2, "X", ImGuiKey_X }, { 2, 3, "C", ImGuiKey_C }, { 2, 4, "V", ImGuiKey_V }
|
|
|
};
|
|
|
|
|
|
- ImDrawList* draw_list = ImGui::GetWindowDrawList();
|
|
|
- draw_list->PushClipRect(board_min, board_max, true);
|
|
|
- for (int n = 0; n < IM_ARRAYSIZE(keys_to_display); n++)
|
|
|
+ // Elements rendered manually via ImDrawList API are not clipped automatically.
|
|
|
+ // While not strictly necessary, here IsItemVisible() is used to avoid rendering these shapes when they are out of view.
|
|
|
+ ImGui::Dummy(ImVec2(board_max.x - board_min.x, board_max.y - board_min.y));
|
|
|
+ if (ImGui::IsItemVisible())
|
|
|
{
|
|
|
- const KeyLayoutData* key_data = &keys_to_display[n];
|
|
|
- ImVec2 key_min = ImVec2(start_pos.x + key_data->Col * key_step.x + key_data->Row * key_row_offset, start_pos.y + key_data->Row * key_step.y);
|
|
|
- ImVec2 key_max = ImVec2(key_min.x + key_size.x, key_min.y + key_size.y);
|
|
|
- draw_list->AddRectFilled(key_min, key_max, IM_COL32(204, 204, 204, 255), key_rounding);
|
|
|
- draw_list->AddRect(key_min, key_max, IM_COL32(24, 24, 24, 255), key_rounding);
|
|
|
- ImVec2 face_min = ImVec2(key_min.x + key_face_pos.x, key_min.y + key_face_pos.y);
|
|
|
- ImVec2 face_max = ImVec2(face_min.x + key_face_size.x, face_min.y + key_face_size.y);
|
|
|
- draw_list->AddRect(face_min, face_max, IM_COL32(193, 193, 193, 255), key_face_rounding, ImDrawFlags_None, 2.0f);
|
|
|
- draw_list->AddRectFilled(face_min, face_max, IM_COL32(252, 252, 252, 255), key_face_rounding);
|
|
|
- ImVec2 label_min = ImVec2(key_min.x + key_label_pos.x, key_min.y + key_label_pos.y);
|
|
|
- draw_list->AddText(label_min, IM_COL32(64, 64, 64, 255), key_data->Label);
|
|
|
- if (ImGui::IsKeyDown(key_data->Key))
|
|
|
- draw_list->AddRectFilled(key_min, key_max, IM_COL32(255, 0, 0, 128), key_rounding);
|
|
|
+ ImDrawList* draw_list = ImGui::GetWindowDrawList();
|
|
|
+ draw_list->PushClipRect(board_min, board_max, true);
|
|
|
+ for (int n = 0; n < IM_ARRAYSIZE(keys_to_display); n++)
|
|
|
+ {
|
|
|
+ const KeyLayoutData* key_data = &keys_to_display[n];
|
|
|
+ ImVec2 key_min = ImVec2(start_pos.x + key_data->Col * key_step.x + key_data->Row * key_row_offset, start_pos.y + key_data->Row * key_step.y);
|
|
|
+ ImVec2 key_max = ImVec2(key_min.x + key_size.x, key_min.y + key_size.y);
|
|
|
+ draw_list->AddRectFilled(key_min, key_max, IM_COL32(204, 204, 204, 255), key_rounding);
|
|
|
+ draw_list->AddRect(key_min, key_max, IM_COL32(24, 24, 24, 255), key_rounding);
|
|
|
+ ImVec2 face_min = ImVec2(key_min.x + key_face_pos.x, key_min.y + key_face_pos.y);
|
|
|
+ ImVec2 face_max = ImVec2(face_min.x + key_face_size.x, face_min.y + key_face_size.y);
|
|
|
+ draw_list->AddRect(face_min, face_max, IM_COL32(193, 193, 193, 255), key_face_rounding, ImDrawFlags_None, 2.0f);
|
|
|
+ draw_list->AddRectFilled(face_min, face_max, IM_COL32(252, 252, 252, 255), key_face_rounding);
|
|
|
+ ImVec2 label_min = ImVec2(key_min.x + key_label_pos.x, key_min.y + key_label_pos.y);
|
|
|
+ draw_list->AddText(label_min, IM_COL32(64, 64, 64, 255), key_data->Label);
|
|
|
+ if (ImGui::IsKeyDown(key_data->Key))
|
|
|
+ draw_list->AddRectFilled(key_min, key_max, IM_COL32(255, 0, 0, 128), key_rounding);
|
|
|
+ }
|
|
|
+ draw_list->PopClipRect();
|
|
|
}
|
|
|
- draw_list->PopClipRect();
|
|
|
- ImGui::Dummy(ImVec2(board_max.x - board_min.x, board_max.y - board_min.y));
|
|
|
}
|
|
|
ImGui::TreePop();
|
|
|
}
|