Files
XCEngine/new_editor/src/Fields/UIEditorVector3FieldInteraction.cpp

92 lines
3.9 KiB
C++

#include <XCEditor/Fields/UIEditorVector3FieldInteraction.h>
#include "Fields/VectorFieldInteractionInternal.h"
#include <utility>
namespace XCEngine::UI::Editor {
namespace {
using ::XCEngine::UI::Editor::Widgets::BuildUIEditorVector3FieldLayout;
using ::XCEngine::UI::Editor::Widgets::FormatUIEditorVector3FieldComponentValue;
using ::XCEngine::UI::Editor::Widgets::HitTestUIEditorVector3Field;
using ::XCEngine::UI::Editor::Widgets::IsUIEditorVector3FieldPointInside;
using ::XCEngine::UI::Editor::Widgets::NormalizeUIEditorVector3FieldComponentValue;
using ::XCEngine::UI::Editor::Widgets::TryParseUIEditorVector3FieldComponentValue;
using ::XCEngine::UI::Editor::Widgets::UIEditorVector3FieldHitTarget;
using ::XCEngine::UI::Editor::Widgets::UIEditorVector3FieldHitTargetKind;
using ::XCEngine::UI::Editor::Widgets::UIEditorVector3FieldInvalidComponentIndex;
using ::XCEngine::UI::Editor::Widgets::UIEditorVector3FieldLayout;
using ::XCEngine::UI::Editor::Widgets::UIEditorVector3FieldMetrics;
using ::XCEngine::UI::Editor::Widgets::UIEditorVector3FieldSpec;
struct Vector3FieldInteractionTraits {
using InteractionState = UIEditorVector3FieldInteractionState;
using InteractionResult = UIEditorVector3FieldInteractionResult;
using Spec = UIEditorVector3FieldSpec;
using Layout = UIEditorVector3FieldLayout;
using Metrics = UIEditorVector3FieldMetrics;
using HitTarget = UIEditorVector3FieldHitTarget;
using HitTargetKind = UIEditorVector3FieldHitTargetKind;
static constexpr std::size_t kComponentCount = 3u;
static constexpr std::size_t kLastComponentIndex = 2u;
static constexpr std::size_t kInvalidComponentIndex = UIEditorVector3FieldInvalidComponentIndex;
static constexpr HitTargetKind kNoneHitTargetKind = UIEditorVector3FieldHitTargetKind::None;
static constexpr HitTargetKind kRowHitTargetKind = UIEditorVector3FieldHitTargetKind::Row;
static constexpr HitTargetKind kComponentHitTargetKind = UIEditorVector3FieldHitTargetKind::Component;
static auto& FieldState(InteractionState& state) { return state.vector3FieldState; }
static const auto& FieldState(const InteractionState& state) { return state.vector3FieldState; }
static Layout BuildLayout(const ::XCEngine::UI::UIRect& bounds, const Spec& spec, const Metrics& metrics) {
return BuildUIEditorVector3FieldLayout(bounds, spec, metrics);
}
static HitTarget HitTest(const Layout& layout, const ::XCEngine::UI::UIPoint& point) {
return HitTestUIEditorVector3Field(layout, point);
}
static bool IsPointInside(const ::XCEngine::UI::UIRect& rect, const ::XCEngine::UI::UIPoint& point) {
return IsUIEditorVector3FieldPointInside(rect, point);
}
static std::string FormatComponentValue(const Spec& spec, std::size_t componentIndex) {
return FormatUIEditorVector3FieldComponentValue(spec, componentIndex);
}
static bool TryParseComponentValue(const Spec& spec, std::string_view text, double& outValue) {
return TryParseUIEditorVector3FieldComponentValue(spec, text, outValue);
}
static double NormalizeComponentValue(const Spec& spec, double value) {
return NormalizeUIEditorVector3FieldComponentValue(spec, value);
}
};
} // namespace
UIEditorVector3FieldInteractionFrame UpdateUIEditorVector3FieldInteraction(
UIEditorVector3FieldInteractionState& state,
UIEditorVector3FieldSpec& spec,
const ::XCEngine::UI::UIRect& bounds,
const std::vector<UIInputEvent>& inputEvents,
const UIEditorVector3FieldMetrics& metrics) {
UIEditorVector3FieldLayout layout = {};
UIEditorVector3FieldInteractionResult result =
Internal::UpdateVectorFieldInteractionImpl<Vector3FieldInteractionTraits>(
state,
spec,
bounds,
inputEvents,
metrics,
layout);
return {
std::move(layout),
std::move(result)
};
}
} // namespace XCEngine::UI::Editor