2026-04-10 00:41:28 +08:00
|
|
|
#include <XCEditor/Fields/UIEditorVector4Field.h>
|
2026-04-08 03:23:15 +08:00
|
|
|
|
2026-04-22 21:48:35 +08:00
|
|
|
#include "UIEditorVectorFieldShared.h"
|
2026-04-08 03:23:15 +08:00
|
|
|
|
|
|
|
|
namespace XCEngine::UI::Editor::Widgets {
|
|
|
|
|
|
|
|
|
|
namespace {
|
|
|
|
|
|
2026-04-22 21:48:35 +08:00
|
|
|
struct Vector4FieldTraits {
|
|
|
|
|
using Spec = UIEditorVector4FieldSpec;
|
|
|
|
|
using State = UIEditorVector4FieldState;
|
|
|
|
|
using Metrics = UIEditorVector4FieldMetrics;
|
|
|
|
|
using Palette = UIEditorVector4FieldPalette;
|
|
|
|
|
using Layout = UIEditorVector4FieldLayout;
|
|
|
|
|
using HitTarget = UIEditorVector4FieldHitTarget;
|
|
|
|
|
using HitTargetKind = UIEditorVector4FieldHitTargetKind;
|
|
|
|
|
|
|
|
|
|
static constexpr std::size_t kComponentCount = 4u;
|
|
|
|
|
static constexpr std::size_t kInvalidComponentIndex =
|
|
|
|
|
UIEditorVector4FieldInvalidComponentIndex;
|
|
|
|
|
static constexpr HitTargetKind kNoneHitTargetKind =
|
|
|
|
|
UIEditorVector4FieldHitTargetKind::None;
|
|
|
|
|
static constexpr HitTargetKind kRowHitTargetKind =
|
|
|
|
|
UIEditorVector4FieldHitTargetKind::Row;
|
|
|
|
|
static constexpr HitTargetKind kComponentHitTargetKind =
|
|
|
|
|
UIEditorVector4FieldHitTargetKind::Component;
|
|
|
|
|
|
|
|
|
|
static const ::XCEngine::UI::UIColor& AxisColor(
|
|
|
|
|
const Palette& palette,
|
|
|
|
|
std::size_t componentIndex) {
|
|
|
|
|
switch (componentIndex) {
|
|
|
|
|
case 0u:
|
|
|
|
|
return palette.axisXColor;
|
|
|
|
|
case 1u:
|
|
|
|
|
return palette.axisYColor;
|
|
|
|
|
case 2u:
|
|
|
|
|
return palette.axisZColor;
|
|
|
|
|
default:
|
|
|
|
|
return palette.axisWColor;
|
|
|
|
|
}
|
2026-04-08 03:23:15 +08:00
|
|
|
}
|
|
|
|
|
|
2026-04-22 21:48:35 +08:00
|
|
|
static ::XCEngine::UI::UIColor& AxisColor(
|
|
|
|
|
Palette& palette,
|
|
|
|
|
std::size_t componentIndex) {
|
|
|
|
|
switch (componentIndex) {
|
|
|
|
|
case 0u:
|
|
|
|
|
return palette.axisXColor;
|
|
|
|
|
case 1u:
|
|
|
|
|
return palette.axisYColor;
|
|
|
|
|
case 2u:
|
|
|
|
|
return palette.axisZColor;
|
|
|
|
|
default:
|
|
|
|
|
return palette.axisWColor;
|
|
|
|
|
}
|
2026-04-08 03:23:15 +08:00
|
|
|
}
|
2026-04-22 21:48:35 +08:00
|
|
|
};
|
2026-04-08 03:23:15 +08:00
|
|
|
|
|
|
|
|
} // namespace
|
|
|
|
|
|
2026-04-22 21:48:35 +08:00
|
|
|
bool IsUIEditorVector4FieldPointInside(const UIRect& rect, const UIPoint& point) {
|
|
|
|
|
return Internal::VectorFieldWidgetShared::IsPointInside(rect, point);
|
2026-04-08 03:23:15 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
double NormalizeUIEditorVector4FieldComponentValue(
|
|
|
|
|
const UIEditorVector4FieldSpec& spec,
|
|
|
|
|
double value) {
|
2026-04-22 21:48:35 +08:00
|
|
|
return Internal::VectorFieldWidgetShared::NormalizeComponentValue<Vector4FieldTraits>(
|
|
|
|
|
spec,
|
|
|
|
|
value);
|
2026-04-08 03:23:15 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool TryParseUIEditorVector4FieldComponentValue(
|
|
|
|
|
const UIEditorVector4FieldSpec& spec,
|
|
|
|
|
std::string_view text,
|
|
|
|
|
double& outValue) {
|
2026-04-22 21:48:35 +08:00
|
|
|
return Internal::VectorFieldWidgetShared::TryParseComponentValue<Vector4FieldTraits>(
|
|
|
|
|
spec,
|
|
|
|
|
text,
|
|
|
|
|
outValue);
|
2026-04-08 03:23:15 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::string FormatUIEditorVector4FieldComponentValue(
|
|
|
|
|
const UIEditorVector4FieldSpec& spec,
|
|
|
|
|
std::size_t componentIndex) {
|
2026-04-22 21:48:35 +08:00
|
|
|
return Internal::VectorFieldWidgetShared::FormatComponentValue<Vector4FieldTraits>(
|
|
|
|
|
spec,
|
|
|
|
|
componentIndex);
|
2026-04-08 03:23:15 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
UIEditorVector4FieldLayout BuildUIEditorVector4FieldLayout(
|
|
|
|
|
const UIRect& bounds,
|
2026-04-22 21:48:35 +08:00
|
|
|
const UIEditorVector4FieldSpec& spec,
|
2026-04-08 03:23:15 +08:00
|
|
|
const UIEditorVector4FieldMetrics& metrics) {
|
2026-04-22 21:48:35 +08:00
|
|
|
return Internal::VectorFieldWidgetShared::BuildLayout<Vector4FieldTraits>(
|
2026-04-08 03:23:15 +08:00
|
|
|
bounds,
|
2026-04-22 21:48:35 +08:00
|
|
|
spec,
|
|
|
|
|
metrics);
|
2026-04-08 03:23:15 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
UIEditorVector4FieldHitTarget HitTestUIEditorVector4Field(
|
|
|
|
|
const UIEditorVector4FieldLayout& layout,
|
|
|
|
|
const UIPoint& point) {
|
2026-04-22 21:48:35 +08:00
|
|
|
return Internal::VectorFieldWidgetShared::HitTest<Vector4FieldTraits>(
|
|
|
|
|
layout,
|
|
|
|
|
point);
|
2026-04-08 03:23:15 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void AppendUIEditorVector4FieldBackground(
|
|
|
|
|
UIDrawList& drawList,
|
|
|
|
|
const UIEditorVector4FieldLayout& layout,
|
|
|
|
|
const UIEditorVector4FieldSpec& spec,
|
|
|
|
|
const UIEditorVector4FieldState& state,
|
|
|
|
|
const UIEditorVector4FieldPalette& palette,
|
|
|
|
|
const UIEditorVector4FieldMetrics& metrics) {
|
2026-04-22 21:48:35 +08:00
|
|
|
Internal::VectorFieldWidgetShared::AppendBackground<Vector4FieldTraits>(
|
|
|
|
|
drawList,
|
|
|
|
|
layout,
|
|
|
|
|
spec,
|
|
|
|
|
state,
|
|
|
|
|
palette,
|
|
|
|
|
metrics);
|
2026-04-08 03:23:15 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void AppendUIEditorVector4FieldForeground(
|
|
|
|
|
UIDrawList& drawList,
|
|
|
|
|
const UIEditorVector4FieldLayout& layout,
|
|
|
|
|
const UIEditorVector4FieldSpec& spec,
|
|
|
|
|
const UIEditorVector4FieldState& state,
|
|
|
|
|
const UIEditorVector4FieldPalette& palette,
|
2026-04-23 01:43:23 +08:00
|
|
|
const UIEditorVector4FieldMetrics& metrics,
|
|
|
|
|
const ::XCEngine::UI::Editor::UIEditorTextMeasurer* textMeasurer) {
|
2026-04-22 21:48:35 +08:00
|
|
|
Internal::VectorFieldWidgetShared::AppendForeground<Vector4FieldTraits>(
|
|
|
|
|
drawList,
|
|
|
|
|
layout,
|
|
|
|
|
spec,
|
|
|
|
|
state,
|
|
|
|
|
palette,
|
2026-04-23 01:43:23 +08:00
|
|
|
metrics,
|
|
|
|
|
textMeasurer);
|
2026-04-08 03:23:15 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void AppendUIEditorVector4Field(
|
|
|
|
|
UIDrawList& drawList,
|
|
|
|
|
const UIRect& bounds,
|
|
|
|
|
const UIEditorVector4FieldSpec& spec,
|
|
|
|
|
const UIEditorVector4FieldState& state,
|
|
|
|
|
const UIEditorVector4FieldPalette& palette,
|
2026-04-23 01:43:23 +08:00
|
|
|
const UIEditorVector4FieldMetrics& metrics,
|
|
|
|
|
const ::XCEngine::UI::Editor::UIEditorTextMeasurer* textMeasurer) {
|
2026-04-22 21:48:35 +08:00
|
|
|
Internal::VectorFieldWidgetShared::AppendField<Vector4FieldTraits>(
|
|
|
|
|
drawList,
|
|
|
|
|
bounds,
|
|
|
|
|
spec,
|
|
|
|
|
state,
|
|
|
|
|
palette,
|
2026-04-23 01:43:23 +08:00
|
|
|
metrics,
|
|
|
|
|
textMeasurer);
|
2026-04-08 03:23:15 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} // namespace XCEngine::UI::Editor::Widgets
|