Skip to content

Commit 8abe124

Browse files
committed
Terminal/Mouse: absolute position
1 parent 1fd4ad7 commit 8abe124

2 files changed

Lines changed: 28 additions & 15 deletions

File tree

modules/Terminal/Canvas.mpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,14 @@ export namespace CppUtils::Terminal
132132
m_stopEvent.notify_all();
133133
}
134134

135+
[[nodiscard]] inline auto getAbsolutePosition() const noexcept -> Container::Size2
136+
{
137+
const auto terminalSize = getTerminalSize();
138+
const auto viewportSize = m_viewport.getSize();
139+
const auto startLine = terminalSize.height() > viewportSize.height() ? terminalSize.height() - viewportSize.height() - 1 : 0;
140+
return {m_viewport.getPosition().x(), startLine + m_viewport.getPosition().y()};
141+
}
142+
135143
private:
136144
std::mutex m_printMutex;
137145
bool m_firstPrint = true;

tests/Terminal/Mouse.mpp

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -31,25 +31,30 @@ namespace CppUtils::UnitTest::Terminal::Mouse
3131
CppUtils::Terminal::PrimitiveStyle::Outline,
3232
CppUtils::Terminal::CharAttributes{});
3333

34-
if (event->position.x() < size.width() and event->position.y() < size.height())
34+
if (const auto origin = canvas.getAbsolutePosition();
35+
event->position.x() >= origin.x() and event->position.y() >= origin.y())
3536
{
36-
auto c = ' ';
37-
switch (event->button)
37+
const auto relativePosition = event->position - origin;
38+
if (relativePosition.x() < size.width() and relativePosition.y() < size.height())
3839
{
39-
case CppUtils::Terminal::Mouse::Button::Left: c = 'L'; break;
40-
case CppUtils::Terminal::Mouse::Button::Middle: c = 'M'; break;
41-
case CppUtils::Terminal::Mouse::Button::Right: c = 'R'; break;
42-
case CppUtils::Terminal::Mouse::Button::ScrollUp: c = '^'; break;
43-
case CppUtils::Terminal::Mouse::Button::ScrollDown: c = 'v'; break;
44-
default: c = '.'; break;
45-
}
40+
auto c = ' ';
41+
switch (event->button)
42+
{
43+
case CppUtils::Terminal::Mouse::Button::Left: c = 'L'; break;
44+
case CppUtils::Terminal::Mouse::Button::Middle: c = 'M'; break;
45+
case CppUtils::Terminal::Mouse::Button::Right: c = 'R'; break;
46+
case CppUtils::Terminal::Mouse::Button::ScrollUp: c = '^'; break;
47+
case CppUtils::Terminal::Mouse::Button::ScrollDown: c = 'v'; break;
48+
default: c = '.'; break;
49+
}
4650

47-
c = event->pressed ? static_cast<char>(std::toupper(c)) : static_cast<char>(std::tolower(c));
48-
canvas.setChar(event->position, CppUtils::Terminal::CharAttributes{c});
51+
c = event->pressed ? static_cast<char>(std::toupper(c)) : static_cast<char>(std::tolower(c));
52+
canvas.setChar(relativePosition, CppUtils::Terminal::CharAttributes{c});
4953

50-
canvas.printText({1, 1}, std::format("Position: {}, {}", event->position.x(), event->position.y()));
51-
canvas.printText({1, 2}, std::format("Button: {} Pressed: {}", (int)event->button, event->pressed));
52-
canvas.printText({1, 3}, std::format("Modifiers: {}{}{}", event->ctrl ? "C" : "", event->alt ? "A" : "", event->shift ? "S" : ""));
54+
canvas.printText({1, 1}, std::format("Position: {}, {}", event->position.x(), event->position.y()));
55+
canvas.printText({1, 2}, std::format("Button: {} Pressed: {}", (int)event->button, event->pressed));
56+
canvas.printText({1, 3}, std::format("Modifiers: {}{}{}", event->ctrl ? "C" : "", event->alt ? "A" : "", event->shift ? "S" : ""));
57+
}
5358
}
5459
canvas.print();
5560
}

0 commit comments

Comments
 (0)