perf(image-picker): cull off-screen thumbnail cells
The image picker laid out and drew every cell in the directory and image grids, including the many cells scrolled out of view. - A cell whose rectangle is not visible now reserves the same space with a dummy of the cell size, so the scroll extent is unchanged, and skips the hit-test and draw. No visible change; only off-screen cells are skipped. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -194,6 +194,12 @@ public:
|
|||||||
if (col != 0) ImGui::SameLine(0, cellGap);
|
if (col != 0) ImGui::SameLine(0, cellGap);
|
||||||
ImVec2 mn = ImGui::GetCursorScreenPos();
|
ImVec2 mn = ImGui::GetCursorScreenPos();
|
||||||
ImVec2 mx(mn.x + cellW, mn.y + cellH);
|
ImVec2 mx(mn.x + cellW, mn.y + cellH);
|
||||||
|
// Off-screen cell: reserve the same space (scroll extent unchanged) but skip hit-test/draw.
|
||||||
|
if (!ImGui::IsRectVisible(mn, mx)) {
|
||||||
|
ImGui::Dummy(ImVec2(cellW, cellH));
|
||||||
|
col = (col + 1) % cols;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
ImGui::PushID((int)(i + 1));
|
ImGui::PushID((int)(i + 1));
|
||||||
const bool clicked = ImGui::InvisibleButton("##idir", ImVec2(cellW, cellH));
|
const bool clicked = ImGui::InvisibleButton("##idir", ImVec2(cellW, cellH));
|
||||||
const bool hov = ImGui::IsItemHovered();
|
const bool hov = ImGui::IsItemHovered();
|
||||||
@@ -224,6 +230,12 @@ public:
|
|||||||
if (col != 0) ImGui::SameLine(0, gap);
|
if (col != 0) ImGui::SameLine(0, gap);
|
||||||
ImVec2 mn = ImGui::GetCursorScreenPos();
|
ImVec2 mn = ImGui::GetCursorScreenPos();
|
||||||
ImVec2 mx(mn.x + cell, mn.y + cell);
|
ImVec2 mx(mn.x + cell, mn.y + cell);
|
||||||
|
// Off-screen cell: reserve the same space (scroll extent unchanged) but skip hit-test/draw.
|
||||||
|
if (!ImGui::IsRectVisible(mn, mx)) {
|
||||||
|
ImGui::Dummy(ImVec2(cell, cell));
|
||||||
|
col = (col + 1) % cols;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
const std::string abs = (std::filesystem::path(s_dir) / s_images[i]).string();
|
const std::string abs = (std::filesystem::path(s_dir) / s_images[i]).string();
|
||||||
const bool sel = (s_selected == abs);
|
const bool sel = (s_selected == abs);
|
||||||
ImGui::PushID((int)(i + 1));
|
ImGui::PushID((int)(i + 1));
|
||||||
|
|||||||
Reference in New Issue
Block a user