refactor(new_editor): snapshot hosted editor restructuring

This commit is contained in:
2026-04-21 00:57:14 +08:00
parent e123e584c8
commit 9b7b369007
248 changed files with 21152 additions and 14397 deletions

View File

@@ -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