@@ -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,19 +75,22 @@ 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 }
9090 }
91+ if (active) {
92+ break ;
93+ }
9194 }
9295 drawList->PrimRect (
9396 xOffset + yOffset + winPos,
@@ -96,47 +99,46 @@ struct HeatMapHelper {
9699 }
97100
98101 // display the grid
99- size_t recordsWindow = v * WND;
100102 auto boxSizeX = std::min (size.x / WND, MAX_BOX_X_SIZE);
101- auto numInputs = getNumInputs ();
103+ auto boxSizeY = std::min (size.y / getNumInputs (), MAX_BOX_Y_SIZE);
104+
102105 winPos = ImGui::GetCursorScreenPos () + ImVec2{0 , 7 };
103- ImGui::InvisibleButton (" sensible area" , ImVec2 (size.x , size.y ));
106+ ImGui::InvisibleButton (" sensitive area" , ImVec2 (size.x , size.y ));
104107 if (ImGui::IsItemHovered ()) {
105108 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 ));
109+ auto slot = (v - 1 ) * WND + std::lround (std::trunc (pos.x / boxSizeX ));
110+ auto row = std::lround (std::trunc (pos.y / boxSizeY ));
108111 describeCell (row, slot);
109112 }
110113
114+ // background
111115 drawList->AddRectFilled (
112116 ImVec2 (0 ., 0 .) + winPos,
113117 ImVec2{size.x , size.y } + winPos,
114118 BACKGROUND_COLOR);
119+ // border
115120 drawList->AddRect (
116121 ImVec2 (0 . - 1 , -1 ) + winPos,
117122 ImVec2{size.x + 1 , size.y - 1 } + winPos,
118123 BORDER_COLOR);
119124
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++) {
125+ // heatmap
126+ size_t totalPrims = WND * getNumInputs ();
127+ drawList->PrimReserve (totalPrims * 6 , totalPrims * 4 );
128+ for (size_t ri = (v - 1 ) * WND; ri < (((size_t )(v)*WND > getNumRecords ()) ? getNumRecords () : v * WND); ++ri) {
128129 auto record = getRecord (ri);
129- ImVec2 xOffset{((ri - (v - 1 ) * WND) * boxSizeX) + padding, 0 };
130+ ImVec2 xOffset{((float )( ri - (v - 1 ) * WND) * boxSizeX) + padding, 0 };
130131 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};
132+
133+ for (auto mi = 0U ; mi < getNumItems (record); mi++) {
134+ ImVec2 yOffSet{0 , ((float )mi * boxSizeY) + padding};
135135 ImVec2 ySize{0 , boxSizeY - 2 * padding};
136136
137+ ImVec2 A = xOffset + yOffSet + winPos;
138+ ImVec2 B = xOffset + xSize + yOffSet + ySize + winPos;
139+
137140 drawList->PrimRect (
138- xOffset + yOffSet + winPos,
139- xOffset + xSize + yOffSet + ySize + winPos,
141+ A, B,
140142 getColor (getValue (*getItem (record, mi))));
141143 }
142144 }
0 commit comments