@@ -43,15 +43,15 @@ struct HeatMapHelper {
4343 {
4444 float padding = 1 ;
4545 // add slider to scroll between the grid display windows
46- size_t nw = getNumRecords () / WND;
46+ size_t nw = getNumRecords () < WND? 1 : getNumRecords () / WND;
4747 ImGui::PushItemWidth (sizeHint.x );
4848 ImGui::SliderInt (" ##window" , &v, 1 , nw, " wnd: %d" , ImGuiSliderFlags_AlwaysClamp);
4949 ImVec2 sliderMin = ImGui::GetItemRectMin ();
5050
5151 constexpr float MAX_BOX_X_SIZE = 16 .f ;
5252 constexpr float MAX_BOX_Y_SIZE = 16 .f ;
5353
54- ImVec2 size = ImVec2 (sizeHint.x , std::min (sizeHint.y , MAX_BOX_Y_SIZE * getNumItems ( 0 ) + 2 ));
54+ ImVec2 size = ImVec2 (sizeHint.x , std::min (sizeHint.y , MAX_BOX_Y_SIZE * getNumInputs ( ) + 2 ));
5555 ImU32 BORDER_COLOR = ImColor (200 , 200 , 200 , 255 );
5656 ImU32 BACKGROUND_COLOR = ImColor (20 , 20 , 20 , 255 );
5757 ImU32 BORDER_COLOR_A = ImColor (200 , 200 , 200 , 0 );
@@ -75,15 +75,15 @@ struct HeatMapHelper {
7575 const static auto colorE = ImColor (ImVec4{0 , 0 , 0 , 0 });
7676
7777 drawList->PrimReserve (nw * 6 , nw * 4 );
78- for (size_t iw = 0 ; iw < nw; ++iw) {
79- ImVec2 xOffset{iw * xsz + 2 * padding, 0 };
78+ for (size_t iw = 1 ; iw <= nw; ++iw) {
79+ ImVec2 xOffset{(iw - 1 ) * xsz + 2 * padding, 0 };
8080 ImVec2 xSize{xsz - 2 * padding, 0 };
8181 ImVec2 yOffset{0 , 2 * padding};
82- ImVec2 ySize{0 , 16 - 4 * padding};
83- bool active = 0 ;
84- for (size_t ir = iw ; ir < ((iw + WND > getNumRecords ()) ? getNumRecords () : iw + WND); ++ir) {
85- for (size_t i = 0 ; i < getNumItems (ir ); ++i) {
86- active = getValue (*getItem (ir , i)) > 0 ;
82+ ImVec2 ySize{0 , MAX_BOX_Y_SIZE - 4 * padding};
83+ bool active = false ;
84+ for (size_t ir = (iw - 1 ) * WND ; ir < ((iw * WND > getNumRecords ()) ? getNumRecords () : iw * WND); ++ir) {
85+ for (size_t i = 0 ; i < getNumItems (getRecord (ir) ); ++i) {
86+ active = getValue (*getItem (getRecord (ir) , i)) > 0 ;
8787 if (active) {
8888 break ;
8989 }
@@ -96,47 +96,46 @@ struct HeatMapHelper {
9696 }
9797
9898 // display the grid
99- size_t recordsWindow = v * WND;
10099 auto boxSizeX = std::min (size.x / WND, MAX_BOX_X_SIZE);
101- auto numInputs = getNumInputs ();
100+ auto boxSizeY = std::min (size.y / getNumInputs (), MAX_BOX_Y_SIZE);
101+
102102 winPos = ImGui::GetCursorScreenPos () + ImVec2{0 , 7 };
103- ImGui::InvisibleButton (" sensible area" , ImVec2 (size.x , size.y ));
103+ ImGui::InvisibleButton (" sensitive area" , ImVec2 (size.x , size.y ));
104104 if (ImGui::IsItemHovered ()) {
105105 auto pos = ImGui::GetMousePos () - winPos;
106- auto slot = (v - 1 ) * WND + std::lround (std::trunc (pos.x / size. x * WND ));
107- auto row = std::lround (std::trunc (pos.y / size. y * numInputs ));
106+ auto slot = (v - 1 ) * WND + std::lround (std::trunc (pos.x / boxSizeX ));
107+ auto row = std::lround (std::trunc (pos.y / boxSizeY ));
108108 describeCell (row, slot);
109109 }
110110
111+ // background
111112 drawList->AddRectFilled (
112113 ImVec2 (0 ., 0 .) + winPos,
113114 ImVec2{size.x , size.y } + winPos,
114115 BACKGROUND_COLOR);
116+ // border
115117 drawList->AddRect (
116118 ImVec2 (0 . - 1 , -1 ) + winPos,
117119 ImVec2{size.x + 1 , size.y - 1 } + winPos,
118120 BORDER_COLOR);
119121
120- size_t totalRects = 0 ;
121- for (size_t ri = (v - 1 ) * WND; ri < recordsWindow; ri++) {
122- auto record = getRecord (ri);
123- totalRects += getNumItems (record);
124- }
125-
126- drawList->PrimReserve (totalRects * 6 , totalRects * 4 );
127- for (size_t ri = (v - 1 ) * WND; ri < recordsWindow; ri++) {
122+ // heatmap
123+ size_t totalPrims = WND * getNumInputs ();
124+ drawList->PrimReserve (totalPrims * 6 , totalPrims * 4 );
125+ for (size_t ri = (v - 1 ) * WND; ri < (((size_t )(v) * WND > getNumRecords ()) ? getNumRecords () : v * WND); ++ri) {
128126 auto record = getRecord (ri);
129- ImVec2 xOffset{((ri - (v - 1 ) * WND) * boxSizeX) + padding, 0 };
127+ ImVec2 xOffset{((float )( ri - (v - 1 ) * WND) * boxSizeX) + padding, 0 };
130128 ImVec2 xSize{boxSizeX - 2 * padding, 0 };
131- auto me = getNumItems (record);
132- auto boxSizeY = std::min (size.y / me, MAX_BOX_Y_SIZE);
133- for (size_t mi = 0 ; mi < me; mi++) {
134- ImVec2 yOffSet{0 , (mi * boxSizeY) + padding};
129+
130+ for (auto mi = 0U ; mi < getNumItems (record); mi++) {
131+ ImVec2 yOffSet{0 , ((float )mi * boxSizeY) + padding};
135132 ImVec2 ySize{0 , boxSizeY - 2 * padding};
136133
134+ ImVec2 A = xOffset + yOffSet + winPos;
135+ ImVec2 B = xOffset + xSize + yOffSet + ySize + winPos;
136+
137137 drawList->PrimRect (
138- xOffset + yOffSet + winPos,
139- xOffset + xSize + yOffSet + ySize + winPos,
138+ A, B,
140139 getColor (getValue (*getItem (record, mi))));
141140 }
142141 }
0 commit comments