Extract editor interaction states

This commit is contained in:
2026-03-26 21:30:46 +08:00
parent 6467d87b81
commit f6286d432c
6 changed files with 106 additions and 25 deletions

View File

@@ -32,7 +32,9 @@ void HierarchyPanel::OnAttach() {
}
void HierarchyPanel::OnSelectionChanged(const SelectionChangedEvent& event) {
m_needsRefresh = true;
if (m_renameState.IsActive() && event.primarySelection != m_renameState.Item()) {
CancelRename();
}
}
void HierarchyPanel::Render() {
@@ -61,7 +63,7 @@ void HierarchyPanel::Render() {
}
if (ImGui::IsWindowHovered() && ImGui::IsMouseDown(0) && !ImGui::IsAnyItemHovered()) {
if (!m_renaming) {
if (!m_renameState.IsActive()) {
m_context->GetSelectionManager().ClearSelection();
}
}
@@ -137,14 +139,17 @@ void HierarchyPanel::RenderEntity(::XCEngine::Components::GameObject* gameObject
ImGui::PushID(static_cast<int>(gameObject->GetID()));
if (m_renaming && m_renamingEntity == gameObject) {
if (m_renameJustStarted) {
if (m_renameState.IsEditing(gameObject->GetID())) {
if (m_renameState.ConsumeFocusRequest()) {
ImGui::SetKeyboardFocusHere();
m_renameJustStarted = false;
}
ImGui::SetNextItemWidth(-1);
if (ImGui::InputText("##Rename", m_renameBuffer, sizeof(m_renameBuffer), ImGuiInputTextFlags_EnterReturnsTrue | ImGuiInputTextFlags_AutoSelectAll)) {
if (ImGui::InputText(
"##Rename",
m_renameState.Buffer(),
m_renameState.BufferSize(),
ImGuiInputTextFlags_EnterReturnsTrue | ImGuiInputTextFlags_AutoSelectAll)) {
CommitRename();
}
@@ -253,25 +258,24 @@ void HierarchyPanel::BeginRename(::XCEngine::Components::GameObject* gameObject)
return;
}
m_renaming = true;
m_renamingEntity = gameObject;
strcpy_s(m_renameBuffer, gameObject->GetName().c_str());
m_renameJustStarted = true;
m_renameState.Begin(gameObject->GetID(), gameObject->GetName().c_str());
}
void HierarchyPanel::CommitRename() {
if (m_renamingEntity && strlen(m_renameBuffer) > 0) {
Commands::RenameEntity(*m_context, m_renamingEntity->GetID(), m_renameBuffer);
if (!m_renameState.IsActive()) {
return;
}
const uint64_t entityId = m_renameState.Item();
if (!m_renameState.Empty() && m_context->GetSceneManager().GetEntity(entityId)) {
Commands::RenameEntity(*m_context, entityId, m_renameState.Buffer());
}
CancelRename();
}
void HierarchyPanel::CancelRename() {
m_renaming = false;
m_renamingEntity = nullptr;
m_renameBuffer[0] = '\0';
m_renameJustStarted = false;
m_renameState.Cancel();
}
void HierarchyPanel::HandleDragDrop(::XCEngine::Components::GameObject* gameObject) {