feat(new_editor): add project panel and polish dock chrome

This commit is contained in:
2026-04-11 20:20:30 +08:00
parent 030230eb1f
commit 0a015b52ca
12 changed files with 1455 additions and 52 deletions

View File

@@ -3,6 +3,7 @@
#include <XCEngine/UI/Widgets/UIFlatHierarchyHelpers.h>
#include <algorithm>
#include <cmath>
#include <numeric>
namespace XCEngine::UI::Editor::Widgets {
@@ -19,16 +20,42 @@ std::vector<std::size_t> BuildItemOffsets(std::size_t count) {
return offsets;
}
constexpr float kTreeFontSize = 12.0f;
float ResolveTreeViewRowHeight(
const UIEditorTreeViewItem& item,
const UIEditorTreeViewMetrics& metrics) {
return item.desiredHeight > 0.0f ? item.desiredHeight : metrics.rowHeight;
}
::XCEngine::UI::UIPoint ResolveDisclosureGlyphPosition(
float ResolveTextTop(const ::XCEngine::UI::UIRect& rect, float fontSize) {
const float lineHeight = fontSize * 1.6f;
return rect.y + std::floor((rect.height - lineHeight) * 0.5f);
}
void AppendDisclosureArrow(
::XCEngine::UI::UIDrawList& drawList,
const ::XCEngine::UI::UIRect& rect,
float insetY) {
return ::XCEngine::UI::UIPoint(rect.x + 2.0f, rect.y + insetY - 1.0f);
bool expanded,
const ::XCEngine::UI::UIColor& color) {
constexpr float kOpticalCenterYOffset = -0.5f;
const float centerX = std::floor(rect.x + rect.width * 0.5f) + 0.5f;
const float centerY =
std::floor(rect.y + rect.height * 0.5f + kOpticalCenterYOffset) + 0.5f;
const float halfExtent = (std::max)(2.5f, std::floor((std::min)(rect.width, rect.height) * 0.24f));
const float triangleHeight = halfExtent * 1.55f;
::XCEngine::UI::UIPoint points[3] = {};
if (expanded) {
points[0] = ::XCEngine::UI::UIPoint(centerX - halfExtent, centerY - triangleHeight * 0.5f);
points[1] = ::XCEngine::UI::UIPoint(centerX + halfExtent, centerY - triangleHeight * 0.5f);
points[2] = ::XCEngine::UI::UIPoint(centerX, centerY + triangleHeight * 0.5f);
} else {
points[0] = ::XCEngine::UI::UIPoint(centerX - triangleHeight * 0.5f, centerY - halfExtent);
points[1] = ::XCEngine::UI::UIPoint(centerX - triangleHeight * 0.5f, centerY + halfExtent);
points[2] = ::XCEngine::UI::UIPoint(centerX + triangleHeight * 0.5f, centerY);
}
drawList.AddFilledTriangle(points[0], points[1], points[2], color);
}
} // namespace
@@ -267,23 +294,21 @@ void AppendUIEditorTreeViewForeground(
for (std::size_t visibleOffset = 0u; visibleOffset < layout.rowRects.size(); ++visibleOffset) {
const UIEditorTreeViewItem& item = items[layout.visibleItemIndices[visibleOffset]];
if (layout.itemHasChildren[visibleOffset]) {
drawList.AddText(
ResolveDisclosureGlyphPosition(
layout.disclosureRects[visibleOffset],
metrics.labelInsetY),
layout.itemExpanded[visibleOffset] ? "v" : ">",
palette.disclosureColor,
12.0f);
AppendDisclosureArrow(
drawList,
layout.disclosureRects[visibleOffset],
layout.itemExpanded[visibleOffset],
palette.disclosureColor);
}
drawList.PushClipRect(layout.labelRects[visibleOffset]);
drawList.AddText(
::XCEngine::UI::UIPoint(
layout.labelRects[visibleOffset].x,
layout.labelRects[visibleOffset].y + metrics.labelInsetY),
ResolveTextTop(layout.labelRects[visibleOffset], kTreeFontSize)),
item.label,
palette.textColor,
12.0f);
kTreeFontSize);
drawList.PopClipRect();
}
drawList.PopClipRect();