Skip to content

Commit 210dc61

Browse files
authored
DPL: make input slots display in DebugGUI scrollable (#14041)
1 parent d1fcd96 commit 210dc61

File tree

4 files changed

+79
-26
lines changed

4 files changed

+79
-26
lines changed

Framework/Core/include/Framework/DeviceControl.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ struct DeviceControl {
5252
int logStreams = 0;
5353
/// An incremental number to identify the device state
5454
int requestedState = 0;
55+
/// The first window in the records buffer to display in GUI
56+
int firstWnd = 1;
5557
};
5658

5759
} // namespace o2::framework

Framework/GUISupport/src/FrameworkGUIDataRelayerUsage.cxx

Lines changed: 72 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,7 @@
1717
#include "Framework/DataProcessingStates.h"
1818
#include "InspectorHelpers.h"
1919
#include "PaletteHelpers.h"
20-
#include "Framework/Logger.h"
21-
#include <iostream>
20+
#include "FrameworkGUIDataRelayerUsage.h"
2221
#include <cstring>
2322
#include <cmath>
2423

@@ -27,11 +26,11 @@ static inline ImVec2 operator-(const ImVec2& lhs, const ImVec2& rhs) { return Im
2726

2827
namespace o2::framework::gui
2928
{
30-
3129
// This is to display the information in the data relayer
3230
struct HeatMapHelper {
3331
template <typename RECORD, typename ITEM>
34-
static void draw(const char* name,
32+
static void draw(const char* /*name*/,
33+
int& v,
3534
ImVec2 const& sizeHint,
3635
std::function<size_t()> const& getNumInputs,
3736
std::function<size_t()> const& getNumRecords,
@@ -42,21 +41,69 @@ struct HeatMapHelper {
4241
std::function<ImU32(int value)> const& getColor,
4342
std::function<void(int row, int column)> const& describeCell)
4443
{
45-
ImVec2 size = ImVec2(sizeHint.x, std::min(sizeHint.y, 16.f * getNumItems(0) + 2));
46-
ImU32 BORDER_COLOR = ImColor(200, 200, 200, 255);
47-
ImU32 BACKGROUND_COLOR = ImColor(20, 20, 20, 255);
44+
float padding = 1;
45+
// add slider to scroll between the grid display windows
46+
size_t nw = getNumRecords() / WND;
47+
ImGui::PushItemWidth(sizeHint.x);
48+
ImGui::SliderInt("##window", &v, 1, nw, "wnd: %d", ImGuiSliderFlags_AlwaysClamp);
49+
ImVec2 sliderMin = ImGui::GetItemRectMin();
50+
4851
constexpr float MAX_BOX_X_SIZE = 16.f;
4952
constexpr float MAX_BOX_Y_SIZE = 16.f;
53+
54+
ImVec2 size = ImVec2(sizeHint.x, std::min(sizeHint.y, MAX_BOX_Y_SIZE * getNumItems(0) + 2));
55+
ImU32 BORDER_COLOR = ImColor(200, 200, 200, 255);
56+
ImU32 BACKGROUND_COLOR = ImColor(20, 20, 20, 255);
57+
ImU32 BORDER_COLOR_A = ImColor(200, 200, 200, 0);
58+
ImU32 BACKGROUND_COLOR_A = ImColor(0, 0, 0, 0);
59+
5060
ImDrawList* drawList = ImGui::GetWindowDrawList();
51-
ImVec2 winPos = ImGui::GetCursorScreenPos() + ImVec2{0, 7};
52-
auto records = getNumRecords();
53-
auto boxSizeX = std::min(size.x / records, MAX_BOX_X_SIZE);
54-
auto numInputs = getNumInputs();
61+
ImVec2 winPos = sliderMin;
5562

63+
// overlay activity indicator on the slider
64+
auto xsz = size.x / nw;
65+
drawList->AddRectFilled(
66+
ImVec2{0., 0.} + winPos,
67+
ImVec2{size.x, size.y} + winPos,
68+
BACKGROUND_COLOR_A);
69+
drawList->AddRect(
70+
ImVec2{0. - 1, -1} + winPos,
71+
ImVec2{size.x + 1, size.y - 1} + winPos,
72+
BORDER_COLOR_A);
73+
74+
const static auto colorA = ImColor(ImVec4{0.945, 0.096, 0.278, 0.5});
75+
const static auto colorE = ImColor(ImVec4{0, 0, 0, 0});
76+
77+
drawList->PrimReserve(nw * 6, nw * 4);
78+
for (size_t iw = 0; iw < nw; ++iw) {
79+
ImVec2 xOffset{iw * xsz + 2 * padding, 0};
80+
ImVec2 xSize{xsz - 2 * padding, 0};
81+
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;
87+
if (active) {
88+
break;
89+
}
90+
}
91+
}
92+
drawList->PrimRect(
93+
xOffset + yOffset + winPos,
94+
xOffset + xSize + yOffset + ySize + winPos,
95+
active ? colorA : colorE);
96+
}
97+
98+
// display the grid
99+
size_t recordsWindow = v * WND;
100+
auto boxSizeX = std::min(size.x / WND, MAX_BOX_X_SIZE);
101+
auto numInputs = getNumInputs();
102+
winPos = ImGui::GetCursorScreenPos() + ImVec2{0, 7};
56103
ImGui::InvisibleButton("sensible area", ImVec2(size.x, size.y));
57104
if (ImGui::IsItemHovered()) {
58105
auto pos = ImGui::GetMousePos() - winPos;
59-
auto slot = std::lround(std::trunc(pos.x / size.x * records));
106+
auto slot = (v - 1) * WND + std::lround(std::trunc(pos.x / size.x * WND));
60107
auto row = std::lround(std::trunc(pos.y / size.y * numInputs));
61108
describeCell(row, slot);
62109
}
@@ -69,21 +116,21 @@ struct HeatMapHelper {
69116
ImVec2(0. - 1, -1) + winPos,
70117
ImVec2{size.x + 1, size.y - 1} + winPos,
71118
BORDER_COLOR);
72-
float padding = 1;
73119

74120
size_t totalRects = 0;
75-
for (size_t ri = 0, re = getNumRecords(); ri < re; ri++) {
121+
for (size_t ri = (v - 1) * WND; ri < recordsWindow; ri++) {
76122
auto record = getRecord(ri);
77123
totalRects += getNumItems(record);
78124
}
79125

80126
drawList->PrimReserve(totalRects * 6, totalRects * 4);
81-
for (size_t ri = 0, re = getNumRecords(); ri < re; ri++) {
127+
for (size_t ri = (v - 1) * WND; ri < recordsWindow; ri++) {
82128
auto record = getRecord(ri);
83-
ImVec2 xOffset{(ri * boxSizeX) + padding, 0};
129+
ImVec2 xOffset{((ri - (v - 1) * WND) * boxSizeX) + padding, 0};
84130
ImVec2 xSize{boxSizeX - 2 * padding, 0};
85-
auto boxSizeY = std::min(size.y / getNumItems(record), MAX_BOX_Y_SIZE);
86-
for (size_t mi = 0, me = getNumItems(record); mi < me; mi++) {
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++) {
87134
ImVec2 yOffSet{0, (mi * boxSizeY) + padding};
88135
ImVec2 ySize{0, boxSizeY - 2 * padding};
89136

@@ -98,11 +145,12 @@ struct HeatMapHelper {
98145
}
99146
};
100147

101-
void displayDataRelayer(DeviceMetricsInfo const& metrics,
102-
DeviceInfo const& info,
148+
void displayDataRelayer(DeviceMetricsInfo const& /*metrics*/,
149+
DeviceInfo const& /*info*/,
103150
DeviceSpec const& spec,
104151
DataProcessingStates const& states,
105-
ImVec2 const& size)
152+
ImVec2 const& size,
153+
int& v)
106154
{
107155
auto getNumInputs = [&states]() -> size_t {
108156
auto& inputsView = states.statesViews[(int)ProcessingStateId::DATA_QUERIES];
@@ -146,7 +194,7 @@ void displayDataRelayer(DeviceMetricsInfo const& metrics,
146194
}
147195
char const* const beginData = strchr(buffer + view.first, ' ') + 1;
148196
// Protect against buffer overflows
149-
if (view.size <= beginData - buffer + i - view.first) {
197+
if ((size_t)view.size <= beginData - buffer + i - view.first) {
150198
return &error;
151199
}
152200
return (int8_t const*)beginData + i; };
@@ -184,7 +232,7 @@ void displayDataRelayer(DeviceMetricsInfo const& metrics,
184232
if ((end - input) == 0) {
185233
continue;
186234
}
187-
if (i == row) {
235+
if (i == (size_t)row) {
188236
ImGui::Text("%d %.*s (%s)", row, int(end - input), input, InspectorHelpers::getLifeTimeStr(spec.inputs[i].matcher.lifetime).c_str());
189237
break;
190238
}
@@ -226,6 +274,7 @@ void displayDataRelayer(DeviceMetricsInfo const& metrics,
226274

227275
if (getNumRecords()) {
228276
HeatMapHelper::draw<int, int8_t>("DataRelayer",
277+
v,
229278
size,
230279
getNumInputs,
231280
getNumRecords,

Framework/GUISupport/src/FrameworkGUIDataRelayerUsage.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
// granted to it by virtue of its status as an Intergovernmental Organization
1010
// or submit itself to any jurisdiction.
1111

12+
#include "Framework/DeviceSpec.h"
1213
class ImVec2;
1314

1415
namespace o2::framework
@@ -19,9 +20,9 @@ class DataProcessingStates;
1920

2021
namespace gui
2122
{
22-
23+
static constexpr int WND = 16;
2324
/// View of the DataRelayer metrics for a given DeviceInfo
24-
void displayDataRelayer(DeviceMetricsInfo const& metrics, DeviceInfo const& info, DeviceSpec const& spec, DataProcessingStates const&, ImVec2 const& size);
25+
void displayDataRelayer(DeviceMetricsInfo const& metrics, DeviceInfo const& info, DeviceSpec const& spec, DataProcessingStates const&, ImVec2 const& size, int& v);
2526

2627
} // namespace gui
2728
} // namespace o2::framework

Framework/GUISupport/src/FrameworkGUIDevicesGraph.cxx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -713,7 +713,8 @@ void showTopologyNodeGraph(WorkspaceGUIState& state,
713713
default:
714714
break;
715715
}
716-
gui::displayDataRelayer(metricsInfos[node->ID], infos[node->ID], specs[node->ID], allStates[node->ID], ImVec2(140., 90.));
716+
717+
gui::displayDataRelayer(metricsInfos[node->ID], infos[node->ID], specs[node->ID], allStates[node->ID], ImVec2(200., 160.), controls[node->ID].firstWnd);
717718
ImGui::EndGroup();
718719

719720
// Save the size of what we have emitted and whether any of the widgets are being used

0 commit comments

Comments
 (0)