#pragma once #include "Panel.h" #include "Core/AssetItem.h" #include "UI/PopupState.h" #include "UI/TreeView.h" namespace XCEngine { namespace Editor { class ProjectPanel : public Panel { public: ProjectPanel(); void Render() override; void Initialize(const std::string& projectPath); private: struct AssetDragDropState { bool dragging = false; bool hoveredTarget = false; bool hoveredValidTarget = false; std::string sourcePath; std::string deliveredSourcePath; AssetItemPtr deliveredTarget; void Reset() { dragging = false; hoveredTarget = false; hoveredValidTarget = false; sourcePath.clear(); deliveredSourcePath.clear(); deliveredTarget.reset(); } }; struct AssetItemInteraction { bool clicked = false; bool contextRequested = false; bool openRequested = false; }; void BeginAssetDragDropFrame(); void RegisterFolderDropTarget(IProjectManager& manager, const AssetItemPtr& folder); void FinalizeAssetDragDrop(IProjectManager& manager); void BeginRename(const AssetItemPtr& item); bool CommitRename(IProjectManager& manager); void CancelRename(); void RenderToolbar(); void RenderFolderTreePane(IProjectManager& manager); void RenderFolderTreeNode(IProjectManager& manager, const AssetItemPtr& folder, const std::string& currentFolderPath); void RenderBrowserPane(IProjectManager& manager); void RenderBrowserHeader(IProjectManager& manager); AssetItemInteraction RenderAssetItem(const AssetItemPtr& item, bool isSelected); static bool MatchesSearch(const AssetItemPtr& item, const std::string& search); static bool IsCurrentTreeBranch(const std::string& currentFolderPath, const std::string& folderPath); char m_searchBuffer[256] = ""; float m_navigationWidth = UI::ProjectNavigationDefaultWidth(); UI::TreeViewState m_folderTreeState; UI::InlineTextEditState m_renameState; UI::DeferredPopupState m_emptyContextMenu; UI::TargetedPopupState m_itemContextMenu; AssetDragDropState m_assetDragDropState; }; } }