Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions frontend/app/components/trace_viewer_v2/input_handler.cc
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,10 @@ ImGuiKey TranslateKey(absl::string_view code) {

void UpdateModifierKeys(const EmscriptenKeyboardEvent* event) {
ImGuiIO& io = ImGui::GetIO();
io.AddKeyEvent(ImGuiKey_ModCtrl, event->ctrlKey);
io.AddKeyEvent(ImGuiKey_ModShift, event->shiftKey);
io.AddKeyEvent(ImGuiKey_ModAlt, event->altKey);
io.AddKeyEvent(ImGuiKey_ModSuper, event->metaKey);
io.AddKeyEvent(ImGuiKey_ModCtrl, event->ctrlKey);
io.AddKeyEvent(ImGuiKey_ModShift, event->shiftKey);
io.AddKeyEvent(ImGuiKey_ModAlt, event->altKey);
io.AddKeyEvent(ImGuiKey_ModSuper, event->metaKey);
}

} // namespace
Expand Down Expand Up @@ -93,9 +93,9 @@ EM_BOOL HandleMouseUp(int, const EmscriptenMouseEvent* event, void*) {
EM_BOOL HandleWheel(int, const EmscriptenWheelEvent* event, void*) {
ImGuiIO& io = ImGui::GetIO();

io.AddKeyEvent(ImGuiKey_ModCtrl, event->mouse.ctrlKey);
io.AddKeyEvent(ImGuiKey_ModShift, event->mouse.shiftKey);
io.AddKeyEvent(ImGuiKey_ModSuper, event->mouse.metaKey);
io.AddKeyEvent(ImGuiKey_ModCtrl, event->mouse.ctrlKey);
io.AddKeyEvent(ImGuiKey_ModShift, event->mouse.shiftKey);
io.AddKeyEvent(ImGuiKey_ModSuper, event->mouse.metaKey);

float wheel_x = static_cast<float>(event->deltaX);
float wheel_y = static_cast<float>(event->deltaY);
Expand Down
97 changes: 97 additions & 0 deletions frontend/app/components/trace_viewer_v2/input_handler_test.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
#include "frontend/app/components/trace_viewer_v2/input_handler.h"

#include <emscripten/em_js.h>
#include <emscripten/html5.h>

#include "<gtest/gtest.h>"
#include "imgui.h"

namespace traceviewer {
namespace {

EM_JS(void, CreateTestCanvas, (), {
if (!document.getElementById('canvas')) {
const canvas = document.createElement('canvas');
canvas.id = 'canvas';
document.body.appendChild(canvas);
}
});

EM_JS(void, DispatchBrowserWheelEvent,
(double dx, double dy, bool ctrl, bool shift, bool meta), {
const el = document.getElementById('canvas');
const event = new WheelEvent('wheel', {
deltaX : dx,
deltaY : dy,
ctrlKey : ctrl,
shiftKey : shift,
metaKey : meta,
bubbles : true,
cancelable : true
});
el.dispatchEvent(event);
});

class InputHandlerTest : public ::testing::Test {
protected:
void SetUp() override {
// CreateTestCanvas();
ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO();
io.DisplaySize = ImVec2(1024, 768);
// Build font atlas to avoid assertion in NewFrame
unsigned char* pixels;
int width, height;
io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height);
}

void TearDown() override { ImGui::DestroyContext(); }
};

TEST_F(InputHandlerTest, HandleWheelUpdatesModifiersAndDeltas) {
ImGuiIO& io = ImGui::GetIO();
EmscriptenWheelEvent event;
memset(&event, 0, sizeof(event));
event.mouse.ctrlKey = true;
event.mouse.shiftKey = false;
event.mouse.metaKey = true;
event.deltaX = 100.0;
event.deltaY = -200.0;

HandleWheel(0, &event, nullptr);

// Prepare for NewFrame to process queued events
io.DeltaTime = 1.0f / 60.0f;
ImGui::NewFrame();

EXPECT_TRUE(io.KeyCtrl);
EXPECT_FALSE(io.KeyShift);
EXPECT_TRUE(io.KeySuper);

// Expect negated and doubled values
EXPECT_FLOAT_EQ(io.MouseWheelH, 100.0f);
EXPECT_FLOAT_EQ(io.MouseWheel, -200.0f);
}

TEST_F(InputHandlerTest, HandleKeyDownUpdatesModifiers) {
ImGuiIO& io = ImGui::GetIO();
EmscriptenKeyboardEvent event;
memset(&event, 0, sizeof(event));
event.ctrlKey = false;
event.shiftKey = true;
event.altKey = false;
event.metaKey = true;

HandleKeyDown(0, &event, nullptr);

io.DeltaTime = 1.0f / 60.0f;
ImGui::NewFrame();

EXPECT_FALSE(io.KeyCtrl);
EXPECT_TRUE(io.KeyShift);
EXPECT_FALSE(io.KeyAlt);
EXPECT_TRUE(io.KeySuper);
}

} // namespace
} // namespace traceviewer
Loading