@@ -138,6 +138,42 @@ ExitStatus App::Application::run() {
138138 const auto canvas_p1 = ImVec2 (canvas_p0.x + canvas_sz.x , canvas_p0.y + canvas_sz.y );
139139 const ImVec2 origin (canvas_p0.x + canvas_sz.x * 0 .5f , canvas_p0.y + canvas_sz.y * 0 .5f );
140140 float lineThickness = 6 .0f ;
141+
142+ // --- Thin integer gridlines with adaptive spacing ---
143+ const ImU32 gridColor = IM_COL32 (200 , 200 , 200 , 255 ); // light gray
144+ const float gridThickness = 1 .0f ; // thin lines
145+ const float minPixelSpacing = 20 .0f ; // minimum spacing in pixels
146+
147+ // Dynamic step based on zoom
148+ float step = 1 .0f ;
149+ while (step * zoom < minPixelSpacing)
150+ step *= 2 .0f ;
151+
152+
153+ // Vertical gridlines
154+ for (float x = 0 ; origin.x + x * zoom < canvas_p1.x ; x += step) {
155+ if (x != 0 ) {
156+ draw_list->AddLine (ImVec2 (origin.x + x * zoom, canvas_p0.y ),
157+ ImVec2 (origin.x + x * zoom, canvas_p1.y ),
158+ gridColor, gridThickness);
159+ draw_list->AddLine (ImVec2 (origin.x - x * zoom, canvas_p0.y ),
160+ ImVec2 (origin.x - x * zoom, canvas_p1.y ),
161+ gridColor, gridThickness);
162+ }
163+ }
164+
165+ // Horizontal gridlines
166+ for (float y = 0 ; origin.y + y * zoom < canvas_p1.y ; y += step) {
167+ if (y != 0 ) {
168+ draw_list->AddLine (ImVec2 (canvas_p0.x , origin.y + y * zoom),
169+ ImVec2 (canvas_p1.x , origin.y + y * zoom),
170+ gridColor, gridThickness);
171+ draw_list->AddLine (ImVec2 (canvas_p0.x , origin.y - y * zoom),
172+ ImVec2 (canvas_p1.x , origin.y - y * zoom),
173+ gridColor, gridThickness);
174+ }
175+ }
176+
141177 draw_list->AddLine (ImVec2 (canvas_p0.x , origin.y ), ImVec2 (canvas_p1.x , origin.y ), IM_COL32 (0 , 0 , 0 , 255 ), lineThickness);
142178 draw_list->AddLine (ImVec2 (origin.x , canvas_p0.y ), ImVec2 (origin.x , canvas_p1.y ), IM_COL32 (0 , 0 , 0 , 255 ), lineThickness);
143179 std::vector<ImVec2> points;
0 commit comments