refactor(new_editor): snapshot hosted editor restructuring
This commit is contained in:
@@ -1,14 +1,41 @@
|
||||
#include "Platform/Win32/EditorWindowInputController.h"
|
||||
#include "Platform/Win32/EditorWindowInputController.h"
|
||||
|
||||
#include <XCEngine/Input/InputTypes.h>
|
||||
|
||||
namespace XCEngine::UI::Editor::App::Internal {
|
||||
#include <chrono>
|
||||
|
||||
namespace XCEngine::UI::Editor::App {
|
||||
|
||||
using ::XCEngine::UI::UIInputEvent;
|
||||
using ::XCEngine::UI::UIInputEventType;
|
||||
using ::XCEngine::UI::UIInputModifiers;
|
||||
using ::XCEngine::UI::UIPointerButton;
|
||||
|
||||
namespace {
|
||||
|
||||
std::uint8_t ButtonMask(UIPointerButton button) {
|
||||
switch (button) {
|
||||
case UIPointerButton::Left: return 1u << 0u;
|
||||
case UIPointerButton::Right: return 1u << 1u;
|
||||
case UIPointerButton::Middle: return 1u << 2u;
|
||||
case UIPointerButton::X1: return 1u << 3u;
|
||||
case UIPointerButton::X2: return 1u << 4u;
|
||||
case UIPointerButton::None:
|
||||
default:
|
||||
return 0u;
|
||||
}
|
||||
}
|
||||
|
||||
std::uint64_t GetInputEventTimestampNanoseconds() {
|
||||
using Clock = std::chrono::steady_clock;
|
||||
return static_cast<std::uint64_t>(
|
||||
std::chrono::duration_cast<std::chrono::nanoseconds>(
|
||||
Clock::now().time_since_epoch())
|
||||
.count());
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
bool EditorWindowInputController::IsTrackingMouseLeave() const {
|
||||
return m_trackingMouseLeave;
|
||||
}
|
||||
@@ -72,15 +99,26 @@ void EditorWindowInputController::QueuePointerEvent(
|
||||
UIInputEventType type,
|
||||
UIPointerButton button,
|
||||
const ::XCEngine::UI::UIPoint& position,
|
||||
WPARAM wParam) {
|
||||
WPARAM wParam,
|
||||
bool doubleClick) {
|
||||
UIInputEvent event = {};
|
||||
event.type = type;
|
||||
event.pointerButton = button;
|
||||
event.position = position;
|
||||
event.timestampNanoseconds = GetInputEventTimestampNanoseconds();
|
||||
event.modifiers = m_modifierTracker.ApplyPointerMessage(
|
||||
type,
|
||||
button,
|
||||
static_cast<std::size_t>(wParam));
|
||||
const std::uint8_t buttonMask = ButtonMask(button);
|
||||
if (doubleClick && type == UIInputEventType::PointerButtonDown) {
|
||||
m_pendingDoubleClickButtons |= buttonMask;
|
||||
}
|
||||
if (type == UIInputEventType::PointerButtonUp &&
|
||||
(m_pendingDoubleClickButtons & buttonMask) != 0u) {
|
||||
event.doubleClick = true;
|
||||
m_pendingDoubleClickButtons &= static_cast<std::uint8_t>(~buttonMask);
|
||||
}
|
||||
m_pendingEvents.push_back(event);
|
||||
}
|
||||
|
||||
@@ -90,6 +128,7 @@ void EditorWindowInputController::QueueSyntheticPointerStateSyncEvent(
|
||||
UIInputEvent event = {};
|
||||
event.type = UIInputEventType::PointerMove;
|
||||
event.position = position;
|
||||
event.timestampNanoseconds = GetInputEventTimestampNanoseconds();
|
||||
event.modifiers = modifiers;
|
||||
m_pendingEvents.push_back(event);
|
||||
}
|
||||
@@ -99,6 +138,7 @@ void EditorWindowInputController::QueuePointerLeaveEvent(
|
||||
UIInputEvent event = {};
|
||||
event.type = UIInputEventType::PointerLeave;
|
||||
event.position = position;
|
||||
event.timestampNanoseconds = GetInputEventTimestampNanoseconds();
|
||||
event.modifiers = m_modifierTracker.GetCurrentModifiers();
|
||||
m_pendingEvents.push_back(event);
|
||||
}
|
||||
@@ -111,6 +151,7 @@ void EditorWindowInputController::QueuePointerWheelEvent(
|
||||
event.type = UIInputEventType::PointerWheel;
|
||||
event.position = position;
|
||||
event.wheelDelta = static_cast<float>(wheelDelta);
|
||||
event.timestampNanoseconds = GetInputEventTimestampNanoseconds();
|
||||
event.modifiers = m_modifierTracker.ApplyPointerMessage(
|
||||
UIInputEventType::PointerWheel,
|
||||
UIPointerButton::None,
|
||||
@@ -122,6 +163,7 @@ void EditorWindowInputController::QueueKeyEvent(UIInputEventType type, WPARAM wP
|
||||
UIInputEvent event = {};
|
||||
event.type = type;
|
||||
event.keyCode = MapVirtualKeyToUIKeyCode(wParam);
|
||||
event.timestampNanoseconds = GetInputEventTimestampNanoseconds();
|
||||
event.modifiers = m_modifierTracker.ApplyKeyMessage(type, wParam, lParam);
|
||||
event.repeat = IsRepeatKeyMessage(lParam);
|
||||
m_pendingEvents.push_back(event);
|
||||
@@ -131,6 +173,7 @@ void EditorWindowInputController::QueueCharacterEvent(WPARAM wParam) {
|
||||
UIInputEvent event = {};
|
||||
event.type = UIInputEventType::Character;
|
||||
event.character = static_cast<std::uint32_t>(wParam);
|
||||
event.timestampNanoseconds = GetInputEventTimestampNanoseconds();
|
||||
event.modifiers = m_modifierTracker.GetCurrentModifiers();
|
||||
m_pendingEvents.push_back(event);
|
||||
}
|
||||
@@ -138,6 +181,7 @@ void EditorWindowInputController::QueueCharacterEvent(WPARAM wParam) {
|
||||
void EditorWindowInputController::QueueWindowFocusEvent(UIInputEventType type) {
|
||||
UIInputEvent event = {};
|
||||
event.type = type;
|
||||
event.timestampNanoseconds = GetInputEventTimestampNanoseconds();
|
||||
m_pendingEvents.push_back(event);
|
||||
}
|
||||
|
||||
@@ -185,6 +229,7 @@ std::vector<UIInputEvent> EditorWindowInputController::TakePendingEvents() {
|
||||
|
||||
void EditorWindowInputController::ClearPendingEvents() {
|
||||
m_pendingEvents.clear();
|
||||
m_pendingDoubleClickButtons = 0u;
|
||||
}
|
||||
|
||||
void EditorWindowInputController::ResetInteractionState() {
|
||||
@@ -197,6 +242,7 @@ void EditorWindowInputController::ResetInteractionState() {
|
||||
void EditorWindowInputController::ResetWindowState() {
|
||||
m_trackingMouseLeave = false;
|
||||
m_pointerCaptureOwner = EditorWindowPointerCaptureOwner::None;
|
||||
m_pendingDoubleClickButtons = 0u;
|
||||
}
|
||||
|
||||
std::int32_t EditorWindowInputController::MapVirtualKeyToUIKeyCode(WPARAM wParam) {
|
||||
@@ -276,4 +322,4 @@ bool EditorWindowInputController::IsRepeatKeyMessage(LPARAM lParam) {
|
||||
return (static_cast<unsigned long>(lParam) & (1ul << 30)) != 0ul;
|
||||
}
|
||||
|
||||
} // namespace XCEngine::UI::Editor::App::Internal
|
||||
} // namespace XCEngine::UI::Editor::App
|
||||
|
||||
Reference in New Issue
Block a user